16,472
社区成员
发帖
与我相关
我的任务
分享
//串口读线程函数
DWORD CSeries::ReadThreadFunc(LPVOID lparam)
{
CSeries *ceSeries = (CSeries*)lparam;
BYTE * pBufReadData = new BYTE[1];
ZeroMemory(pBufReadData,1);
BYTE * pBufHeadData = new BYTE[4];
ZeroMemory(pBufHeadData,4);
BYTE * pBufRecv = new BYTE[MAX_CMD_SIZE];
ZeroMemory(pBufRecv,MAX_CMD_SIZE);
while (TRUE)
{
ZeroMemory(pBufReadData,1);
ZeroMemory(pBufHeadData,4);
ZeroMemory(pBufRecv,MAX_CMD_SIZE);
DWORD dwActualReadLen = 0; //每次读取到的实际长度
DWORD dwRecvLen = 0; //读取到的数据总长度
DWORD dwDataLen = 0; //数据帧长度
//读命令帧头
while(TRUE)
{
ReadFile(ceSeries->m_hComm, pBufReadData, 1, &dwActualReadLen,0);
if (dwActualReadLen != 1)
continue;
pBufHeadData[0] = pBufHeadData[1];
pBufHeadData[1] = pBufHeadData[2];
pBufHeadData[2] = pBufHeadData[3];
pBufHeadData[3] = pBufReadData[0];
if (pBufHeadData[0] == 0x55 && pBufHeadData[1] == 0xAA &&
pBufHeadData[2] == 0x81 && pBufHeadData[3] == 0x01)
{
memcpy(pBufRecv,pBufHeadData,4);
dwRecvLen = 4;
break;
}
}
//如果读数据帧失败,直接返回超时
while(TRUE)
{
ReadFile(ceSeries->m_hComm, pBufReadData, 1, &dwActualReadLen,0);
if (dwActualReadLen != 1)
continue;
//每次读取一个字节,并保存
memcpy(pBufRecv + dwRecvLen,pBufReadData,1);
dwRecvLen++;
//计算数据帧长度
if(dwRecvLen == 7)
dwDataLen = pBufRecv[5]*0100 + pBufRecv[6];
//读取完成退出循环
if (dwRecvLen == 7+dwDataLen)
break;
}
ceSeries->m_OnSeriesRead(pBufRecv,dwRecvLen);
}
delete pBufRecv;
pBufRecv = NULL;
delete pBufHeadData;
pBufHeadData = NULL;
delete pBufReadData;
pBufReadData = NULL;
}