QSerialPort readyRead 信号仅在应用程序被 waitForReadyRead() 阻塞时发出

Posted

技术标签:

【中文标题】QSerialPort readyRead 信号仅在应用程序被 waitForReadyRead() 阻塞时发出【英文标题】:QSerialPort readyRead signal only emitted when app is blocked by waitForReadyRead() 【发布时间】:2019-10-27 14:28:46 【问题描述】:

我正在使用 PyQT5 编写简单的应用程序来从串口读取数据,但是从串口接收数据时不会发出readyRead

如果应用程序被waitForReadyRead() 阻止,则在接收到数据时调用dataReady()

将 Windows 10 与 Python 3.7.4、PyQt5 5.13.1 结合使用

重现问题的最少代码:

from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget
from PyQt5.QtWidgets import QMainWindow, QLabel
from PyQt5.QtCore import Qt, QIODevice
from PyQt5.QtSerialPort import QSerialPort
import sys


class ExampleGUI(QMainWindow):
    def __init__(self):
        super().__init__()

        #self.setGeometry(50,50,500,300)
        self.setWindowTitle("Example")

        # Start mainLayout
        self.mainLayout = QVBoxLayout()

        serialLabel = QLabel("Example program")
        self.mainLayout.addWidget(serialLabel)

        widget = QWidget()
        widget.setLayout(self.mainLayout)
        self.setCentralWidget(widget)

        self.serPort = QSerialPort()
        self.serPort.readyRead.connect(self.dataReady)
        self.serPort.setPortName("COM4")
        self.serPort.setBaudRate(9600)
        self.serPort.open(QIODevice.ReadWrite)
        self.serPort.writeData("Hi".encode())
        # self.serPort.waitForReadyRead()

    def dataReady(self):
        print(bytes(self.serPort.readAll()))


if __name__ == '__main__':
    app = QApplication([])
    gui = ExampleGUI()
    gui.show()
    app.exec_()

【问题讨论】:

【参考方案1】:

似乎是 Qt https://bugreports.qt.io/browse/QTBUG-78086 中的错误。使用旧版本 5.13.0 可以解决问题。

【讨论】:

以上是关于QSerialPort readyRead 信号仅在应用程序被 waitForReadyRead() 阻塞时发出的主要内容,如果未能解决你的问题,请参考以下文章

接收不到 QTcpSocket 的 readyRead 信号?

Qt的QTcpSocket ReadyRead信号的实现

QT程序socket的readyRead信号不触发

QTcpSocket readyRead() 信号多次发出

QextSerialPort (QIODevice) 的 readyRead() 信号调用速度不够快

QTcpSocket类中的ReadyRead()信号没有被触发