Qt串口QSerialPort丢包问题,QSerialPort和QTimer定时器中断冲突的解决

问题描述

我的这篇文章中提到了Qt中QSerialPort的内存泄漏问题。在云台随动的头瞄系统中,还要求云台高速实时的随动,这一点在上一篇文章中并没有解决。
当时的原因,主要是QTimer定时器对串口读取线程的影响(具体如何影响的我还没有查到资料,但实际效果是QTimer的线程好像阻塞了串口读取的线程),具体情况为:
1.利用QTimer进行图像显示,每隔一定时间刷新图像
2.另一个线程同步读取串口中IMU的数据
3.测量时间可知,读取串口的线程在QTimer中断时耗时会大幅增加

还有一个问题是QSerialPort丢包。Qt5加入了QSerialPort的串口类,但经常会丢包,例如:持续读取IMU的数据,由于IMU数据有固定的帧格式,因此可以校验正确性,持续读取一段时间后会发现,数据帧格式错误,记录数据可以发现在中间某一刻丢包若干字节。

解决方案

针对定时器对读取串口线程的影响

实验发现,定时器只是对读取串口线程的频率产生了影响,实际传输到串口的数据并没有丢失。显然,如果按照原本数据产生的频率读取串口,读到的总是老的数据,且串口缓存的数据在越来越多。

解决:一次性读多帧数据。目前实验发现,定时器只是对串口读取线程的程序运行速度产生了影响,但单次读取串口的速度依然正常,因此每次读取串口都保证读完程序延长的时间内所产生的数据即可。

针对QSerialPort丢包

如果每次恰好只读一帧长度的数据,显然不能进行纠错,而为了解决定时器的线程的影响,每次读取时不得不读取多帧数据,因此只需要在多帧数据中根据各个校验位找到一帧可用的数据即可,毕竟QSerialPort的丢包不会每帧都出现。

你可能感兴趣的:(qt,多线程,bug)