VC 串口接收数据的解析
以前没弄过串口编程,所以问题可能会比较白痴,我把问题描述的详细点。
从串口接收数据,串口会一直返回这样格式的数据:02001401018200000C334455660000000000000000421E,
02: 数据头
00 14:全数据长度
01 01:特殊含义的字段
82 00:特殊含义的字段
00 0C:需要得到的数据的长度
334455660000000000000000 需要得到的数据
421E:CRC校验
问题,我需要接收到的数据应该是02001401018200000C334455660000000000000000421E一整条,
但结果却是半条,或者一条半,两条半
为什么会这样,该怎样解决,最好详细点。
代码如下:
我接受数据的函数:
读串口:
DWORD CCESeries::ReadThreadFunc(LPVOID lparam){ CCESeries *ceSeries = (CCESeries*)lparam; DWORD evtMask; BYTE * readBuf = NULL;//读取的字节 DWORD actualReadLen=0;//实际读取的字节数 DWORD willReadLen; DWORD dwReadErrors; COMSTAT cmState; // 清空缓冲,并检查串口是否打开。 ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE); //清空串口 PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR ); SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR ); while (TRUE) { if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0)) { SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR ); //表示串口收到字符 if (evtMask & EV_RXCHAR) { ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState); willReadLen = cmState.cbInQue ; if (willReadLen <= 0) { continue; } //分配内存 readBuf = new BYTE[willReadLen]; ZeroMemory(readBuf,willReadLen); //读取串口数据 ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0); //如果读取的数据大于0, if (actualReadLen>0) { //触发读取回调函数 if (ceSeries->m_OnSeriesRead) { ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen); } } //释放内存 delete[] readBuf; readBuf = NULL; } } //如果收到读线程退出信号,则退出线程 if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0) { break; } //Sleep(1000); } return 0;}void CALLBACK MyDlg::OnSerialRead(void * pOwner,BYTE* buf,DWORD bufLen){ BYTE *pRecvBuf = NULL; //接收缓冲区 //得到父对象指针 MyDlg* pThis = (MyDlg*)pOwner; //将接收的缓冲区拷贝到pRecvBuf种 pRecvBuf = new BYTE[bufLen]; CopyMemory(pRecvBuf,buf,bufLen); //发送异步消息,表示收到串口数据,消息处理完,应释放内存 pThis->PostMessage(WM_RECV_SERIAL_DATA,WPARAM(pRecvBuf),bufLen);}LONG MyDlg::OnRecvSerialData(WPARAM wParam,LPARAM lParam){ CString strRecv = L""; //串口接收到的BUF BYTE *pBuf = (BYTE*)wParam; //串口接收到的BUF长度 DWORD dwBufLen = lParam; CString temp; for(int i=0;i<lParam;i++) { temp.Format(L"%02x",pBuf[i]); strRecv+=temp; } //将新接收到的文本添加到接收框中 m_table.InsertItem(0,strRecv); //释放内存 delete[] pBuf; pBuf = NULL; return 0;}