问题出现:用虚拟串口模拟  设备向上位机发送指令

readyRead()触发后 串口对象执行readAll()  发现收到的指令偶尔不完整  会缺少几个字节 偶尔也完整 很随机

试过网上方法:如加延时 再去读 结果也是一样

QT版本:Qt Creator 4.8.1 (Enterprise)

编译器版本:Qt 5.12.1 (MinGW 7.3.0 64-bit)

*************更新 问题已解决*****************

问题分析:readyRead() 的官方描述

 简述:每次在设备读取通道 有新数据 可读取时 readyRead()就会触发 

所以我们使用readyRead()触发后 用readAll()直接读取串口缓存 存在随机性

因为他一旦有数据就会触发  但可能串口缓存里的数据还没接收完 就直接readAll()

导致数据不完整

那我们在readyRead()后做延时处理 再去readAll()应该就可以解决

为什么还是不行?

不是延时不行而是延时操作错误

我搜到的解决办法 延时操作 其实都是阻塞线程的 比如我用的是 

QElapsedTimer t;
t.start();
while(t.elapsed()<500);

还有一些类似的也会 阻塞线程 导致你做这样的延时操作时 其实你的串口也被阻塞 所以最后读出来的数据跟不延时一样的 也是有缺失的

所以要用 非阻塞延迟 

**********解决方法**********:

QCoreApplication::processEvents() 会继续处理 让程序保持响应 

t.start();

//关键部分 QCoreApplication::processEvents()
while(t.elapsed()<500) QCoreApplication::processEvents();

serial->readAll();

或者用其他的非阻塞延迟的方法

PS: waitForReadyRead(int msecs = 30000) 和 readyRead()

本质其实是一样的 相当于 connect 了 readyRead() 信号 然后执行让waitForReadyRead 置为 true 

超过wait时间 readyRead() 信号就置为false 

所以如果用waitForReadyRead()

碰到了相同的问题 也可以用相同的解决方法

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐