CSerialPort.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. m_hComm = CreateFile(m_portNum.c_str(),
  36. GENERIC_READ | GENERIC_WRITE, //允许读和写
  37. 0, //独占方式
  38. NULL, OPEN_EXISTING, //打开而不是创建
  39. 0, //同步方式
  40. NULL
  41. );
  42. if(m_hComm == INVALID_HANDLE_VALUE)
  43. {
  44. int error = GetLastError();
  45. return false;
  46. }
  47. else
  48. {
  49. SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE); // 设置读写缓冲区大小
  50. COMMTIMEOUTS TimeOuts; //设定读超时
  51. TimeOuts.ReadIntervalTimeout = 1000;
  52. TimeOuts.ReadTotalTimeoutMultiplier = 500;
  53. TimeOuts.ReadTotalTimeoutConstant = 5000; //设定写超时
  54. TimeOuts.WriteTotalTimeoutMultiplier = 500;
  55. TimeOuts.WriteTotalTimeoutConstant = 2000;
  56. SetCommTimeouts(m_hComm, &TimeOuts); //设置超时
  57. DCB dcb;
  58. GetCommState(m_hComm, &dcb);
  59. dcb.BaudRate = m_dwBaudRate;
  60. dcb.ByteSize = m_byteSize;
  61. dcb.Parity = m_parityBit;
  62. dcb.StopBits = m_stopBit;
  63. if(!SetCommState(m_hComm, &dcb))
  64. {
  65. TCHAR szBuf[1024] = { 0 };
  66. wsprintf(szBuf, L"串口设置失败,错误代码: %d", GetLastError());
  67. MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OK);
  68. return false;
  69. }
  70. }
  71. //在读写串口前,用 PurgeComm 函数清空缓冲区
  72. BOOL ret = PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
  73. if (!ret)
  74. {
  75. TCHAR szBuf[1024] = { 0 };
  76. wsprintf(szBuf, _T("清空缓冲区失败,错误代码: %d"), GetLastError());
  77. MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  78. }
  79. m_bOpen = true;
  80. return true;
  81. }
  82. // 关闭串口
  83. void CSerialPort::closeComm()
  84. {
  85. if (!m_bOpen)
  86. {
  87. return;
  88. }
  89. CloseHandle(m_hComm);
  90. }
  91. // 向串口发送数据
  92. bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
  93. {
  94. #ifdef _DEBUG
  95. assert(m_bOpen == true || dwLength > 0);
  96. //return false;
  97. #endif // _DEBUG
  98. DWORD dwError = 0;
  99. if(ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
  100. {
  101. PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
  102. }
  103. DWORD dwTx = 0;
  104. BOOL ret = FALSE;
  105. ret = WriteFile(m_hComm, data, dwLength, &dwTx, NULL);
  106. if(ret == FALSE)
  107. {
  108. TCHAR szBuf[1024] = { 0 };
  109. wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
  110. MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  111. return false;
  112. }
  113. return true;
  114. }
  115. // 从串口中读取数据
  116. bool CSerialPort::readFromComm(char buffer[], DWORD dwLength, DWORD* nReaded)
  117. {
  118. #ifdef _DEBUG
  119. assert(m_bOpen == true || dwLength > 0);
  120. //return false;
  121. #endif // _DEBUG
  122. COMSTAT comStat;
  123. DWORD dwError = 0;
  124. if(ClearCommError(m_hComm, &dwError, &comStat) && dwError > 0)
  125. {
  126. PurgeComm(m_hComm, PURGE_RXABORT | PURGE_RXCLEAR);
  127. }
  128. DWORD dwRx = 0; // 读入的字节数
  129. BOOL ret = FALSE;
  130. ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL); // 读入数据
  131. if(ret == TRUE)
  132. {
  133. *nReaded = dwRx;
  134. return true;
  135. }
  136. else
  137. {
  138. TCHAR szBuf[1024] = { 0 };
  139. wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
  140. MessageBox(NULL, szBuf, L"ERROR", MB_OK);
  141. return false;
  142. }
  143. return true;
  144. }