CSerialPort.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #include "../pch/pch.h"
  2. #include "CSerialPort.h"
  3. CSerialPort::CSerialPort(
  4. const std::wstring portNum,
  5. DWORD baudRate /* = 9600 */,
  6. BYTE byteSize /* = 8 */,
  7. BYTE parityBit /* = NOPARITY */,
  8. BYTE stopBit /* = ONESTOPBIT */
  9. ) : m_portNum(portNum),
  10. m_dwBaudRate(baudRate),
  11. m_byteSize(byteSize),
  12. m_parityBit(parityBit),
  13. m_stopBit(stopBit),
  14. m_bOpen(false)
  15. {
  16. }
  17. CSerialPort::CSerialPort(
  18. DWORD baudRate /* = 9600 */,
  19. BYTE byteSize /* = 8 */,
  20. BYTE parityBit /* = NOPARITY */,
  21. BYTE stopBit /* = ONESTOPBIT */
  22. ) : m_dwBaudRate(baudRate),
  23. m_byteSize(byteSize),
  24. m_parityBit(parityBit),
  25. m_stopBit(stopBit),
  26. m_bOpen(false)
  27. {
  28. }
  29. CSerialPort::~CSerialPort()
  30. {
  31. }
  32. // 打开串口成功,返回 true
  33. bool CSerialPort::openComm()
  34. {
  35. std::wstring realPort = _T("\\\\.\\") + m_portNum;
  36. m_hComm = CreateFile(realPort.c_str(),
  37. GENERIC_READ | GENERIC_WRITE, //允许读和写
  38. 0, //独占方式
  39. NULL,
  40. OPEN_EXISTING, //打开而不是创建
  41. 0, //同步方式
  42. NULL
  43. );
  44. if(m_hComm == INVALID_HANDLE_VALUE)
  45. {
  46. int error = GetLastError();
  47. return false;
  48. }
  49. else
  50. {
  51. SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE); // 设置读写缓冲区大小
  52. COMMTIMEOUTS TimeOuts; //设定读超时
  53. TimeOuts.ReadIntervalTimeout = MAXDWORD;
  54. TimeOuts.ReadTotalTimeoutMultiplier = 0;
  55. TimeOuts.ReadTotalTimeoutConstant = 0; //设定写超时
  56. TimeOuts.WriteTotalTimeoutMultiplier = 500;
  57. TimeOuts.WriteTotalTimeoutConstant = 2000;
  58. SetCommTimeouts(m_hComm, &TimeOuts); //设置超时
  59. DCB dcb;
  60. GetCommState(m_hComm, &dcb);
  61. dcb.BaudRate = m_dwBaudRate;
  62. dcb.ByteSize = m_byteSize;
  63. dcb.Parity = m_parityBit;
  64. dcb.StopBits = m_stopBit;
  65. if(!SetCommState(m_hComm, &dcb))
  66. {
  67. TCHAR szBuf[1024] = { 0 };
  68. wsprintf(szBuf, L"串口设置失败,错误代码: %d", GetLastError());
  69. //MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OK);
  70. return false;
  71. }
  72. }
  73. //在读写串口前,用 PurgeComm 函数清空缓冲区
  74. BOOL ret = PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
  75. if (!ret)
  76. {
  77. TCHAR szBuf[1024] = { 0 };
  78. wsprintf(szBuf, _T("清空缓冲区失败,错误代码: %d"), GetLastError());
  79. //MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  80. }
  81. m_bOpen = true;
  82. return true;
  83. }
  84. // 关闭串口
  85. void CSerialPort::closeComm()
  86. {
  87. if (!m_bOpen)
  88. {
  89. return;
  90. }
  91. CloseHandle(m_hComm);
  92. }
  93. // 向串口发送数据
  94. bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
  95. {
  96. #ifdef _DEBUG
  97. assert(m_bOpen == true || dwLength > 0);
  98. //return false;
  99. #endif // _DEBUG
  100. DWORD dwError = 0;
  101. if(ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
  102. {
  103. PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
  104. }
  105. DWORD dwTx = 0;
  106. BOOL ret = FALSE;
  107. ret = WriteFile(m_hComm, data, dwLength, &dwTx, NULL);
  108. if(ret == FALSE)
  109. {
  110. TCHAR szBuf[1024] = { 0 };
  111. wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
  112. //MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  113. return false;
  114. }
  115. return true;
  116. }
  117. // 从串口中读取数据
  118. bool CSerialPort::readFromComm(char buffer[], DWORD dwLength, DWORD* nReaded)
  119. {
  120. #ifdef _DEBUG
  121. assert(m_bOpen == true || dwLength > 0);
  122. //return false;
  123. #endif // _DEBUG
  124. COMSTAT comStat;
  125. DWORD dwError = 0;
  126. if(ClearCommError(m_hComm, &dwError, &comStat) && dwError > 0)
  127. {
  128. PurgeComm(m_hComm, PURGE_RXABORT | PURGE_RXCLEAR);
  129. }
  130. DWORD dwRx = 0; // 读入的字节数
  131. BOOL ret = FALSE;
  132. ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL); // 读入数据
  133. if(ret == TRUE)
  134. {
  135. *nReaded = dwRx;
  136. return true;
  137. }
  138. else
  139. {
  140. TCHAR szBuf[1024] = { 0 };
  141. wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
  142. //MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  143. return false;
  144. }
  145. return true;
  146. }