Need to know how to configure serial communication to update baudrate, databits, etc

Please support our C++ advertiser: Intel Parallel Studio Home
Thread Solved

Join Date: Aug 2009
Posts: 10
Reputation: nicholasamh is an unknown quantity at this point 
Solved Threads: 0
nicholasamh nicholasamh is offline Offline
Newbie Poster

Need to know how to configure serial communication to update baudrate, databits, etc

 
0
  #1
Aug 25th, 2009
Hi, i am using visual studio 2008, C++ MFC to do my program. I am doing serial communication. I have a GUI C++ program. At the beginning, i will ask user to choose the com port then connect it. After that, i will need to let the user change the baudrate, databit, parity, stopbit and flowcontrol, then update the serial configuration. I would like to know how can i edit my serial.cpp, serial .h and main gui file in order to change the setting. Sorry that i've posted so many thread about this serial communication. I am new to C++ and need to rush a program out. This is only the first part. I still need to do a scipt for my program. The scipt will be like hyper terminal. Need to figure that out too. Hope that all of you can help me. Thanks alot alot alot.

Serial.cpp
-------------
  1. // Serial.cpp: implementation of the CSerial class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4.  
  5. #include "stdafx.h"
  6. #include "Serial.h"
  7.  
  8. CSerial::CSerial()
  9. {
  10.  
  11. memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED));
  12. memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED));
  13. m_hIDComDev = NULL;
  14. m_bOpened = FALSE;
  15.  
  16. }
  17.  
  18. CSerial::~CSerial()
  19. {
  20.  
  21. Close();
  22.  
  23. }
  24.  
  25. BOOL CSerial::Open(int nPort, int nBaud)
  26. {
  27.  
  28. if(m_bOpened)
  29. return TRUE;
  30.  
  31. char szPort[15];
  32. char szComParams[50];
  33. DCB dcb;
  34.  
  35. wsprintf((LPTSTR)szPort, (LPTSTR)L"COM%d", nPort );
  36.  
  37. m_hIDComDev = CreateFile((LPWSTR)szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
  38. if(m_hIDComDev == INVALID_HANDLE_VALUE)
  39. return FALSE;
  40.  
  41. memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED));
  42. memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED));
  43.  
  44. dcb.DCBlength = sizeof(DCB);
  45. GetCommState(m_hIDComDev, &dcb);
  46.  
  47. if(GetCommState(m_hIDComDev, &dcb))
  48. {
  49. dcb.BaudRate = nBaud;
  50. dcb.ByteSize = 8;
  51. dcb.Parity = NOPARITY;
  52. dcb.StopBits = ONESTOPBIT;
  53. dcb.fBinary = TRUE;
  54. dcb.fParity = TRUE;
  55. }
  56. else
  57. return FALSE;
  58.  
  59. COMMTIMEOUTS CommTimeOuts;
  60. CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
  61. CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
  62. CommTimeOuts.ReadTotalTimeoutConstant = 0;
  63. CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
  64. CommTimeOuts.WriteTotalTimeoutConstant = 5000;
  65. SetCommTimeouts( m_hIDComDev, &CommTimeOuts );
  66.  
  67. wsprintf((LPWSTR)szComParams, (LPWSTR)"COM%d:%d,8,None,1,Hardware", nPort, nBaud );
  68.  
  69. m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
  70. m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
  71.  
  72. //dcb.DCBlength = sizeof(DCB);
  73. /*GetCommState(m_hIDComDev, &dcb);
  74. dcb.BaudRate = nBaud;
  75. dcb.ByteSize = 8;
  76.  
  77. unsigned char ucSet;
  78. ucSet = (unsigned char) ((FC_RTSCTS & FC_DTRDSR) != 0);
  79. ucSet = (unsigned char) ((FC_RTSCTS & FC_RTSCTS) != 0);
  80. ucSet = (unsigned char) ((FC_RTSCTS & FC_XONXOFF) != 0);*/
  81.  
  82. /*if (!BuildCommDCB((LPCTSTR)"9600,n,8,1", &dcb))
  83. return FALSE;
  84. else
  85. return TRUE;*/
  86.  
  87. if(!SetCommState(m_hIDComDev, &dcb) ||
  88. !SetupComm(m_hIDComDev, 10000, 10000) ||
  89. m_OverlappedRead.hEvent == NULL ||
  90. m_OverlappedWrite.hEvent == NULL)
  91. {
  92. DWORD dwError = GetLastError();
  93. if(m_OverlappedRead.hEvent != NULL)
  94. CloseHandle(m_OverlappedRead.hEvent);
  95. if(m_OverlappedWrite.hEvent != NULL)
  96. CloseHandle(m_OverlappedWrite.hEvent);
  97. CloseHandle(m_hIDComDev);
  98. return FALSE;
  99. }
  100.  
  101. m_bOpened = TRUE;
  102.  
  103. return(m_bOpened);
  104.  
  105. }
  106. BOOL CSerial::Close( void )
  107. {
  108.  
  109. if( !m_bOpened || m_hIDComDev == NULL ) return( TRUE );
  110.  
  111. if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
  112. if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
  113. CloseHandle( m_hIDComDev );
  114. m_bOpened = FALSE;
  115. m_hIDComDev = NULL;
  116.  
  117. return( TRUE );
  118.  
  119. }
  120.  
  121. BOOL CSerial::WriteCommByte( unsigned char ucByte )
  122. {
  123. BOOL bWriteStat;
  124. DWORD dwBytesWritten;
  125.  
  126. bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
  127. if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) ){
  128. if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0;
  129. else{
  130. GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
  131. m_OverlappedWrite.Offset += dwBytesWritten;
  132. }
  133. }
  134.  
  135. return( TRUE );
  136.  
  137. }
  138.  
  139. int CSerial::SendData( const char *buffer, int size )
  140. {
  141.  
  142. if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
  143.  
  144. DWORD dwBytesWritten = 0;
  145. int i;
  146. for( i=0; i<size; i++ ){
  147. WriteCommByte( buffer[i] );
  148. dwBytesWritten++;
  149. }
  150.  
  151. return( (int) dwBytesWritten );
  152.  
  153. }
  154.  
  155. int CSerial::ReadDataWaiting( void )
  156. {
  157.  
  158. if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
  159.  
  160. DWORD dwErrorFlags;
  161. COMSTAT ComStat;
  162.  
  163. ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
  164.  
  165. return( (int) ComStat.cbInQue );
  166.  
  167. }
  168.  
  169. int CSerial::ReadData( void *buffer, int limit )
  170. {
  171.  
  172. if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
  173.  
  174. BOOL bReadStatus;
  175. DWORD dwBytesRead, dwErrorFlags;
  176. COMSTAT ComStat;
  177.  
  178. ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
  179. if( !ComStat.cbInQue ) return( 0 );
  180.  
  181. dwBytesRead = (DWORD) ComStat.cbInQue;
  182. if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
  183.  
  184. bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
  185. if( !bReadStatus ){
  186. if( GetLastError() == ERROR_IO_PENDING ){
  187. WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
  188. return( (int) dwBytesRead );
  189. }
  190. return( 0 );
  191. }
  192.  
  193. return( (int) dwBytesRead );
  194.  
  195. }
  196.  
  197.  
  198.  
  199.  
  200. Serial.h
  201. -------------
  202. // Serial.h: interface for the CSerial class.
  203. //
  204. //////////////////////////////////////////////////////////////////////
  205.  
  206. #ifndef __SERIAL_H__
  207. #define __SERIAL_H__
  208.  
  209. #define FC_DTRDSR 0x01
  210. #define FC_RTSCTS 0x02
  211. #define FC_XONXOFF 0x04
  212. #define ASCII_BEL 0x07
  213. #define ASCII_BS 0x08
  214. #define ASCII_LF 0x0A
  215. #define ASCII_CR 0x0D
  216. #define ASCII_XON 0x11
  217. #define ASCII_XOFF 0x13
  218.  
  219. class CSerial
  220. {
  221.  
  222. public:
  223. CSerial();
  224. ~CSerial();
  225.  
  226. BOOL Open(int nPort = 1, int nBaud = 9600);
  227. BOOL Close(void);
  228.  
  229. int ReadData(void *, int );
  230. int SendData(const char *, int );
  231. int ReadDataWaiting( void );
  232.  
  233. BOOL IsOpened( void ){ return( m_bOpened ); }
  234.  
  235. protected:
  236. BOOL WriteCommByte( unsigned char );
  237.  
  238. HANDLE m_hIDComDev;
  239. OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
  240. BOOL m_bOpened;
  241.  
  242. };
  243.  
  244. #endif
Last edited by John A; Aug 26th, 2009 at 12:38 am. Reason: added code tags
Reply With Quote Quick reply to this message  
Reply

This thread has been marked solved.
Perhaps start a new thread instead?
Message:


Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC