65,211
社区成员
发帖
与我相关
我的任务
分享bool CSerialPort::openComm()
{
m_hComm = CreateFileA(m_portNum.c_str(),
GENERIC_READ | GENERIC_WRITE, //允许读和写
0, //独占方式
NULL, OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL
);
if (m_hComm == INVALID_HANDLE_VALUE)
{
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))
{
return false;
}
}
//在读写串口前,用 PurgeComm 函数清空缓冲区
PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);
m_bOpen = true;
return true;
}// 向串口发送数据
bool CSerialPort::writeToComm(const char* pData, unsigned int length)
{
DWORD dwError = 0;
if (ClearCommError(m_hComm, &dwError, NULL) && dwError > 0)
{
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR);
}
DWORD dwTx = 0;
BOOL ret = FALSE;
printf(pData);
printf("send\n");
ret = WriteFile(m_hComm, pData, length, &dwTx, NULL);
if (ret == FALSE)
{
return false;
}
return true;
}UINT CSerialPort::GetBytesInCOM()
{
DWORD dwError = 0; /** 错误码 */
COMSTAT comstat; /** COMSTAT结构体,记录通信设备的状态信息 */
memset(&comstat, 0, sizeof(COMSTAT));
UINT BytesInQue = 0;
/** 在调用ReadFile和WriteFile之前,通过本函数清除以前遗留的错误标志 */
if (ClearCommError(m_hComm, &dwError, &comstat))
{
BytesInQue = comstat.cbInQue; /** 获取在输入缓冲区中的字节数 */
}
return BytesInQue;
}
bool CSerialPort::recv()
{
UINT BytesInQue = GetBytesInCOM();
if (BytesInQue == 0)
return false;
while (BytesInQue > 0)
{
BOOL bResult = TRUE;
DWORD BytesRead = 0;
char buf[bufsize];
/** 从缓冲区读取n个字节的数据 */
bResult = ReadFile(m_hComm, &buf, BytesInQue, &BytesRead, NULL);
if ((!bResult))
{
/** 获取错误码,可以根据该错误码查出错误原因 */
DWORD dwError = GetLastError();
/** 清空串口缓冲区 */
PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_RXABORT);
return false;
}
if (BytesInQue + (int)strRecv.size() < bufsize)
strRecv += std::string(buf, BytesInQue);
else
strRecv = std::string(buf, BytesInQue);
Sleep(100);
BytesInQue = GetBytesInCOM();
}
return true;
}