欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

串口数据接收处理的一种方法

程序员文章站 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