串口数据接收处理的一种方法
程序员文章站
2024-03-26 08:17:02
...
在处理串口接收到的数据时,面临的问题主要是是如何接收到完整的数据,对于数据如何处理等。不管是在微控制器中使用串口还是在桌面应用中使用串口,都需要解决这个接收的数据包处理的问题。最近在做一个应用,主要是上位机发送指令,查询下位机相关的数据。假设一帧数据是由10字节构成的,指令和应答数据均为10字节,应答数据发送频率为5Hz。有两个问题需要解决,第一个就是数据帧什么时候接收完成,第二个接收完成如何处理。
针对第一个问题,我的方法是,利用一个定时器来监控数据是否接收完成,接收一个数据就重新装载定时器的计数值,定时时间应该在ms级别(10个字节也可能会多发或少发),假设是115200的波特率,那么10个字节的数据时间大概在0.9ms ,考虑到可能会有阻塞,可以定时5ms,5ms没有接收到新的数据,就说明接收已经完成了,颗粒有点像看门狗的思路。这个问题解决后,就要解决第二个问题了。我的上位机使用Qt来做的,给出一个代码,代码中用到的数据需要在头文件中定义:
/*read data*/
void Widget::readSerialData(void)
{
timerMonitorSerial->start(5);
QByteArray buf;
buf=serialPort->readAll();
for(unsigned char index=0;index<buf.size();index++)
{
receiverQueue.enqueue(buf.at(i)&0xFF);
}
buf.clear();
}
/*time out,receive complete*/
void Widget::serialDataResolution()
{
timerMonitorSerial->stop();
int executionCount=0;
executionCount=receiverQueue.size();
for(quint8 index=0;index<executionCount;index++)
{
serialPortProtocolResolution(receiverQueue.dequeue());
}
receiverQ