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