Qt串口接收数据长度不稳定问题

来源:互联网 发布:学而时之不亦说乎全文 编辑:程序博客网 时间:2024/05/20 17:27

最近在做一个实时接收数据的项目,需要每2ms接收下位机发来的两帧数据,算是串口高速接收。

在使用的过程中,发现串口接收的数据长度不稳定,有时长有时短。

代码如下:

 connect(serial,SIGNAL(readyRead()),this,SLOT(serial_receive()));

然后在槽函数里

serial->read(all);
发现读出来的数据竟然远远超过了两帧,于是改用

serial->read(2);
这次读出来的数据依旧不稳定,例如我要的数据是0x02,0xff。有时候读出来确是0x02,0x00。

出现这个问题,从网上百度,大部分人的描述是readyread函数并不是每一次一有数据就触发,而是不定次数地触发,这样才导致这个问题的出现,使得每次读取的数据长度不一样。

经过我的思考,我认为原因并不是这样的,readyread函数确实是一收到数据就会触发槽函数,而数据长度不稳定的原因就在于,串口接收数据并不会等你槽函数处理完之后才继续接收,有可能在你进入槽函数时串口便又接收了好几个数据(这会出现在高速接收的情况下,而且我认为此时不会重复触发槽函数,原理应该和无法中断嵌套差不多),这时如果使用readall的话,接收的长度自然是不稳定的,无法保证串口在这段时间内又接收到了多少数据,这也就解释了为什么我用read(2)时会出现后面的数据为00的情况,因为readready触发的条件是接收一个数据,而我却读了两个,我无法保证在这么短的时间内串口能接收到下一个数据,但实验结果证明其实大部分时间是可以的,但会有30%左右的概率会使我read的动作超前于接收的动作,因此出现了后面的数据为0的情况

原创粉丝点击