| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- #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(
- DWORD baudRate /* = 9600 */,
- BYTE byteSize /* = 8 */,
- BYTE parityBit /* = NOPARITY */,
- BYTE stopBit /* = ONESTOPBIT */
- ) : 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, //允许读和写
- 0, //独占方式
- NULL, OPEN_EXISTING, //打开而不是创建
- 0, //同步方式
- NULL
- );
- if(m_hComm == INVALID_HANDLE_VALUE)
- {
- int error = GetLastError();
- return false;
- }
- else
- {
- SetupComm(m_hComm, MAX_BUFFER_SIZE, MAX_BUFFER_SIZE); // 设置读写缓冲区大小
- COMMTIMEOUTS TimeOuts; //设定读超时
- TimeOuts.ReadIntervalTimeout = 1000;
- TimeOuts.ReadTotalTimeoutMultiplier = 500;
- TimeOuts.ReadTotalTimeoutConstant = 5000; //设定写超时
- TimeOuts.WriteTotalTimeoutMultiplier = 500;
- TimeOuts.WriteTotalTimeoutConstant = 2000;
- SetCommTimeouts(m_hComm, &TimeOuts); //设置超时
- DCB dcb;
- 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 函数清空缓冲区
- BOOL ret = PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
- if (!ret)
- {
- TCHAR szBuf[1024] = { 0 };
- wsprintf(szBuf, _T("清空缓冲区失败,错误代码: %d"), GetLastError());
- MessageBox(NULL, szBuf, L"ERROR", MB_OK);
- }
- m_bOpen = true;
- return true;
- }
- // 关闭串口
- void CSerialPort::closeComm()
- {
- if (!m_bOpen)
- {
- return;
- }
- 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, DWORD* nReaded)
- {
- #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;
- ret = ReadFile(m_hComm, buffer, dwLength, &dwRx, NULL); // 读入数据
- if(ret == TRUE)
- {
- *nReaded = dwRx;
- return true;
- }
- else
- {
- TCHAR szBuf[1024] = { 0 };
- wsprintf(szBuf, _T("读取数据失败,错误代码: %d"), GetLastError());
- MessageBox(NULL, szBuf, L"ERROR", MB_OK);
- return false;
- }
- return true;
- }
|