|
@@ -2,17 +2,17 @@
|
|
|
#include "CSerialPort.h"
|
|
#include "CSerialPort.h"
|
|
|
|
|
|
|
|
CSerialPort::CSerialPort(
|
|
CSerialPort::CSerialPort(
|
|
|
- const std::wstring portNum,
|
|
|
|
|
- DWORD baudRate /* = 9600 */,
|
|
|
|
|
- BYTE byteSize /* = 8 */,
|
|
|
|
|
- BYTE parityBit /* = NOPARITY */,
|
|
|
|
|
- BYTE stopBit /* = ONESTOPBIT */
|
|
|
|
|
|
|
+ const std::wstring portNum,
|
|
|
|
|
+ DWORD baudRate /* = 9600 */,
|
|
|
|
|
+ BYTE byteSize /* = 8 */,
|
|
|
|
|
+ BYTE parityBit /* = NOPARITY */,
|
|
|
|
|
+ BYTE stopBit /* = ONESTOPBIT */
|
|
|
) : m_portNum(portNum),
|
|
) : m_portNum(portNum),
|
|
|
-m_dwBaudRate(baudRate),
|
|
|
|
|
-m_byteSize(byteSize),
|
|
|
|
|
-m_parityBit(parityBit),
|
|
|
|
|
-m_stopBit(stopBit),
|
|
|
|
|
-m_bOpen(false)
|
|
|
|
|
|
|
+ m_dwBaudRate(baudRate),
|
|
|
|
|
+ m_byteSize(byteSize),
|
|
|
|
|
+ m_parityBit(parityBit),
|
|
|
|
|
+ m_stopBit(stopBit),
|
|
|
|
|
+ m_bOpen(false)
|
|
|
{
|
|
{
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -26,48 +26,48 @@ CSerialPort::~CSerialPort()
|
|
|
|
|
|
|
|
bool CSerialPort::openComm()
|
|
bool CSerialPort::openComm()
|
|
|
{
|
|
{
|
|
|
- m_hComm = CreateFile(m_portNum.c_str(),
|
|
|
|
|
- GENERIC_READ | GENERIC_WRITE, //允许读和写
|
|
|
|
|
- 0, //独占方式
|
|
|
|
|
- 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;
|
|
|
|
|
|
|
+ m_hComm = CreateFile(m_portNum.c_str(),
|
|
|
|
|
+ GENERIC_READ | GENERIC_WRITE, //允许读和写
|
|
|
|
|
+ 0, //独占方式
|
|
|
|
|
+ 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;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -75,7 +75,7 @@ bool CSerialPort::openComm()
|
|
|
|
|
|
|
|
void CSerialPort::closeComm()
|
|
void CSerialPort::closeComm()
|
|
|
{
|
|
{
|
|
|
- CloseHandle(m_hComm);
|
|
|
|
|
|
|
+ CloseHandle(m_hComm);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -83,29 +83,30 @@ void CSerialPort::closeComm()
|
|
|
bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
|
|
bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
|
|
|
{
|
|
{
|
|
|
#ifdef _DEBUG
|
|
#ifdef _DEBUG
|
|
|
- assert(m_bOpen == true || dwLength > 0);
|
|
|
|
|
- //return false;
|
|
|
|
|
|
|
+ assert(m_bOpen == true || dwLength > 0);
|
|
|
|
|
+ //return false;
|
|
|
#endif // _DEBUG
|
|
#endif // _DEBUG
|
|
|
- DWORD dwError = 0;
|
|
|
|
|
- if (ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
|
|
|
|
|
- {
|
|
|
|
|
- PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ DWORD dwError = 0;
|
|
|
|
|
|
|
|
- DWORD dwTx = 0;
|
|
|
|
|
- BOOL ret = FALSE;
|
|
|
|
|
- ret = WriteFile(m_hComm, data, dwLength, &dwTx, NULL);
|
|
|
|
|
|
|
+ if(ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- if (ret == FALSE)
|
|
|
|
|
- {
|
|
|
|
|
- TCHAR szBuf[1024] = { 0 };
|
|
|
|
|
- wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
|
|
|
|
|
- MessageBox(NULL, szBuf, L"ERROR", MB_OK);
|
|
|
|
|
|
|
+ DWORD dwTx = 0;
|
|
|
|
|
+ BOOL ret = FALSE;
|
|
|
|
|
+ ret = WriteFile(m_hComm, data, dwLength, &dwTx, NULL);
|
|
|
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ if(ret == FALSE)
|
|
|
|
|
+ {
|
|
|
|
|
+ TCHAR szBuf[1024] = { 0 };
|
|
|
|
|
+ wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
|
|
|
|
|
+ MessageBox(NULL, szBuf, L"ERROR", MB_OK);
|
|
|
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -115,36 +116,37 @@ bool CSerialPort::writeToComm(BYTE data[], DWORD dwLength)
|
|
|
bool CSerialPort::readFromComm(char buffer[], DWORD dwLength)
|
|
bool CSerialPort::readFromComm(char buffer[], DWORD dwLength)
|
|
|
{
|
|
{
|
|
|
#ifdef _DEBUG
|
|
#ifdef _DEBUG
|
|
|
- assert(m_bOpen == true || dwLength > 0);
|
|
|
|
|
- //return false;
|
|
|
|
|
|
|
+ assert(m_bOpen == true || dwLength > 0);
|
|
|
|
|
+ //return false;
|
|
|
#endif // _DEBUG
|
|
#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;
|
|
|
|
|
- ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL); // 读入数据
|
|
|
|
|
-
|
|
|
|
|
- if (ret == TRUE)
|
|
|
|
|
- {
|
|
|
|
|
- LOG_INFO("read num:" << dwRx);
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
- return true;
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- TCHAR szBuf[1024] = { 0 };
|
|
|
|
|
- wsprintf(szBuf, _T("数据读取失败,错误代码: %d"), GetLastError());
|
|
|
|
|
- MessageBox(NULL, szBuf, L"Error", MB_OK);
|
|
|
|
|
-
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return true;
|
|
|
|
|
|
|
+ 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;
|
|
|
|
|
+ ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL); // 读入数据
|
|
|
|
|
+
|
|
|
|
|
+ if(ret == TRUE)
|
|
|
|
|
+ {
|
|
|
|
|
+ LOG_INFO("read num:" << dwRx);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ TCHAR szBuf[1024] = { 0 };
|
|
|
|
|
+ wsprintf(szBuf, _T("数据读取失败,错误代码: %d"), GetLastError());
|
|
|
|
|
+ MessageBox(NULL, szBuf, L"Error", MB_OK);
|
|
|
|
|
+
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
}
|
|
}
|