QT readyRead() 触发后 readAll() 数据不完全问题的解决方法 waitForReadyRead同理
问题出现:用虚拟串口模拟 设备向上位机发送指令
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()
碰到了相同的问题 也可以用相同的解决方法
更多推荐

所有评论(0)