|
|
@@ -0,0 +1,160 @@
|
|
|
+#include "../pch/pch.h"
|
|
|
+#include "CSerialPort.h"
|
|
|
+
|
|
|
+CSerialPort::CSerialPort(
|
|
|
+ const std::wstring portNum,
|
|
|
+ DWORD baudRate /* = 9600 */,
|
|
|
+ BYTE byteSize /* = 8 */,
|
|
|
+ BYTE parityBit /* = NOPARITY */,
|
|
|
+ BYTE stopBit /* = ONESTOPBIT */
|
|
|
+) : m_portNum(portNum),
|
|
|
+m_dwBaudRate(baudRate),
|
|
|
+m_byteSize(byteSize),
|
|
|
+m_parityBit(parityBit),
|
|
|
+m_stopBit(stopBit),
|
|
|
+m_bOpen(false)
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+CSerialPort::~CSerialPort()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 打开串口成功,返回 true
|
|
|
+
|
|
|
+bool CSerialPort::openComm()
|
|
|
+{
|
|
|
+ m_hComm = CreateFile(m_portNum.c_str(),
|
|
|
+ GENERIC_READ | GENERIC_WRITE, //允许读和写
|
|
|
+ FILE_SHARE_READ | FILE_SHARE_WRITE, //独占方式
|
|
|
+ NULL, OPEN_EXISTING, //打开而不是创建
|
|
|
+ 0, //同步方式
|
|
|
+ NULL
|
|
|
+ );
|
|
|
+
|
|
|
+ if (m_hComm == INVALID_HANDLE_VALUE)
|
|
|
+ {
|
|
|
+ int error = GetLastError();
|
|
|
+ int a = error;
|
|
|
+
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DCB dcb;
|
|
|
+ SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE); // 设置读写缓冲区大小
|
|
|
+ GetCommState(m_hComm, &dcb);
|
|
|
+ dcb.BaudRate = m_dwBaudRate;
|
|
|
+ dcb.ByteSize = m_byteSize;
|
|
|
+ dcb.Parity = m_parityBit;
|
|
|
+ dcb.StopBits = m_stopBit;
|
|
|
+
|
|
|
+ if (!SetCommState(m_hComm, &dcb))
|
|
|
+ {
|
|
|
+ TCHAR szBuf[1024] = { 0 };
|
|
|
+ wsprintf(szBuf, L"串口设置失败,错误代码: %d", GetLastError());
|
|
|
+ MessageBox(NULL, szBuf, TEXT("ERROR"), MB_OK);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //在读写串口前,用 PurgeComm 函数清空缓冲区
|
|
|
+ PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
|
|
|
+
|
|
|
+ m_bOpen = true;
|
|
|
+
|
|
|
+ return true;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 关闭串口
|
|
|
+
|
|
|
+void CSerialPort::closeComm()
|
|
|
+{
|
|
|
+ CloseHandle(m_hComm);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// 向串口发送数据
|
|
|
+bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
|
|
|
+{
|
|
|
+#ifdef _DEBUG
|
|
|
+ assert(m_bOpen == true || dwLength > 0);
|
|
|
+ //return false;
|
|
|
+#endif // _DEBUG
|
|
|
+ DWORD dwError = 0;
|
|
|
+ if (ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
|
|
|
+ {
|
|
|
+ PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
|
|
|
+ }
|
|
|
+
|
|
|
+ DWORD dwTx = 0;
|
|
|
+ BOOL ret = FALSE;
|
|
|
+ ret = WriteFile(m_hComm, data, dwLength, &dwTx, NULL);
|
|
|
+
|
|
|
+ if (ret == FALSE)
|
|
|
+ {
|
|
|
+ TCHAR szBuf[1024] = { 0 };
|
|
|
+ wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
|
|
|
+ MessageBox(NULL, szBuf, L"ERROR", MB_OK);
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+// 从串口中读取数据
|
|
|
+
|
|
|
+bool CSerialPort::readFromComm(char buffer[], DWORD dwLength)
|
|
|
+{
|
|
|
+#ifdef _DEBUG
|
|
|
+ assert(m_bOpen == true || dwLength > 0);
|
|
|
+ //return false;
|
|
|
+#endif // _DEBUG
|
|
|
+
|
|
|
+ COMSTAT comStat;
|
|
|
+ DWORD dwError = 0;
|
|
|
+ if (ClearCommError(m_hComm, &dwError, &comStat) && dwError > 0)
|
|
|
+ {
|
|
|
+ PurgeComm(m_hComm, PURGE_RXABORT | PURGE_RXCLEAR);
|
|
|
+ }
|
|
|
+
|
|
|
+ DWORD dwRx = 0; // 读入的字节数
|
|
|
+ BOOL ret = FALSE;
|
|
|
+ BYTE* byReadData = new BYTE[dwLength];
|
|
|
+ char szTmp[4] = { 0 };
|
|
|
+ int sizeOfBytes = sizeof(szTmp);
|
|
|
+ ret = ReadFile(m_hComm, byReadData, dwLength, &dwRx, NULL); // 读入数据
|
|
|
+
|
|
|
+ if (ret == TRUE)
|
|
|
+ {
|
|
|
+ LOG_INFO("read num:" << dwRx);
|
|
|
+ for (int i = 0; i < dwRx; ++i)
|
|
|
+ {
|
|
|
+ sprintf_s(szTmp, "%02x", byReadData[i]);
|
|
|
+ strcat_s(buffer, sizeOfBytes*dwLength, szTmp);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 释放内存
|
|
|
+ delete byReadData;
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TCHAR szBuf[1024] = { 0 };
|
|
|
+ wsprintf(szBuf, _T("数据读取失败,错误代码: %d"), GetLastError());
|
|
|
+ MessageBox(NULL, szBuf, L"Error", MB_OK);
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|