【问题标题】:PyQt readyRead: set text from serial to multiple labelsPyQt readyRead:将文本从串行设置为多个标签
【发布时间】:2023-02-17 05:22:28
【问题描述】:

在 PyQt5 中,我想在写入(请求值)后读取我的串口。我已经使用 readyRead.connect(self.readingReady) 让它工作了,但是我仅限于输出到一个文本字段。

请求参数的代码向串口发送一个字符串。之后,我使用 readingReady 函数读取串行端口并将结果打印到 plainTextEdit 表单。

def read_configuration(self):
    if self.serial.isOpen():
        self.serial.write(f"?request1\n".encode())
        self.label_massGainOutput.setText(f"{self.serial.readAll().data().decode()}"[:-2])
        self.serial.write(f"?request2\n".encode())
        self.serial.readyRead.connect(self.readingReady)
        self.serial.write(f"?request3\n".encode())
        self.serial.readyRead.connect(self.readingReady)

def readingReady(self):
    data = self.serial.readAll()
    if len(data) > 0:
        self.plainTextEdit_commandOutput.appendPlainText(f"{data.data().decode()}"[:-2])
    else: self.serial.flush()

我遇到的问题是,我希望串行端口的每个答案都转到不同的 plainTextEdit 表单。我现在看到的唯一解决方案是为每个请求编写一个单独的 readingReady 函数(我有很多!现在只显示三个)。这必须以更好的方式成为可能。也许在 readingReady 函数中使用参数?或者从我可以重定向到正确形式的函数返回一个值?

在不使用 readyRead 信号的情况下,我所有的值都落后一位。所以第一个请求什么都不打印,第二个请求打印第一个等等,最后一个不打印出来。

有人有更好的方法来实现此功能吗?

【问题讨论】:

    标签: python pyqt5 serial-port signals-slots qiodevice


    【解决方案1】:

    QSerialPort有asyncronous(readyRead)和syncronous API(waitForReadyRead),如果你只在启动时读取配置一次并且在此过程中ui冻结对你来说不是关键,你可以使用同步API。

    serial.write(f"?request1
    ".encode())
    serial.waitForReadyRead()
    res = serial.read(10)
    serial.write(f"?request2
    ".encode())
    serial.waitForReadyRead()
    res = serial.read(10)
    

    这种简化假设响应以一个块的形式出现,并且消息大小小于或等于 10 字节,这是无法保证的。实际代码应该是这样的:

    def isCompleteMessage(res):
        # your code here
    
    serial.write(f"?request2
    ".encode())
    res = b''
    while not isCompleteMessage(res):
        serial.waitForReadyRead()
        res += serial.read(10)
    

    或者,您可以创建工作线程或线程,在其中同步打开端口和查询请求,并使用信号向应用程序发送响应 - 没有冻结,代码清晰,系统稍微复杂一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-30
      • 2011-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多