Qt readyRead信号避坑:不产生readyRead信号的解决方法
- 引言
- 一、QSerialport的readyRead
- 1.1 版本问题
- 1.2 缓存问题
- 1.3 阻塞问题
- 二、Q(Tcp)Socket的readyRead
- 2.1 阻塞问题
- 2.2 运行一段时间,突然不发信号
- 2.3 和具体数据有关?
引言
目前没遇到相关坑,接收到数据不产生readyRead
信号(可能和版本或者系统有关
),偶然看到关于QTcpSocket的readyRead还有QSerialport的readyRead有坑,特记录。
一、QSerialport的readyRead
1.1 版本问题
- 有问题版本总结:
Qt5.15.2
、Qt5.14.2
、Qt5.13.1
、Qt5.12.5
,很神奇 为什么这么多版本有问题…
Qt5.13.1版本 QSerialport不产生readyRead信号的bug:https://blog.csdn.net/weixin_42485732/article/details/110674994
QT避坑一(串口readyRead信号不产生):https://blog.csdn.net/LongRunning/article/details/147068112
关于QT5.13.1或者其他版本串口readyRead信号不产生的解决方法:https://blog.csdn.net/qq_37868856/article/details/103147353
1.2 缓存问题
串口缓存满后不再接受数据,无法触发readReady
信号,和网络缓存区别很大。
串口通信收不到QSerialPort::readyRead信号的问题:https://juejin.cn/post/7317522848451657778
- 使用
bool QSerialPort::clear(QSerialPort::Directions directions = AllDirections)
函数清理缓存
1.3 阻塞问题
使用类似waitForBytesWritten
的函数会阻塞线程的函数,可能造成信号丢失,再来一个信号会覆盖前面的信号
QSerialport readyRead 信号偶发不响应问题:https://www.cnblogs.com/yangjinghui/p/17497956.html
二、Q(Tcp)Socket的readyRead
Qt的QTcpSocket的readyRead信号使用体会(
机制讲解,较详细
):https://blog.csdn.net/dengdew/article/details/79065608
2.1 阻塞问题
解决 QT udp接收不到数据包问题:https://blog.csdn.net/qq_45304158/article/details/108625740 - 问题1
2.2 运行一段时间,突然不发信号
解决办法,可以重启Socket:
解决 QT udp接收不到数据包问题:https://blog.csdn.net/qq_45304158/article/details/108625740 - 问题2
QT下udpsocket一段时间接收不到数据的问题:https://blog.csdn.net/zhulichen/article/details/52491132
- 核心问题就是,缓存中,有数据没有接收完,导致不发readyRead信号,网上也有其他解决办法:
-
主动接收
:比如采用定时器触发槽函数read数据,或手动发送readyRead信号尝试接收
-
被动接收
:每次都用readAll
函数读取,保证数据被读完,下一次有新数据就必能发readyRead信号
2.3 和具体数据有关?
不确定,没有试过:
数据中有0x0a 或 0x0d就会触发此信号:https://blog.csdn.net/qcddao4/article/details/134623704