PyQT5 QtSerialPort 从端口读取十六进制问题

问题描述 投票:0回答:1

我有以下配置: Raspberry Rpi4B / Python 3.11.2 / PyQt5 5.15.9 触摸屏 HDMI IPS 10,1" 1024x600

当我使用 QtSerialPort 与计算机示例进行通信时遇到问题。 开启通讯没问题,发送Hex数据也没问题。仅当接收十六进制数据时 错端分开。请参阅下面我的代码。我尝试过不同的阅读方式,但结果总是一样。

我想我可能没有使用正确的命令。它一定很简单。我用另一台计算机检查发送的十六进制数据是正确的。

from PyQt5 import QtCore, QtWidgets, QtSerialPort

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.send1_btn = QtWidgets.QPushButton(
            text="Send1",
            clicked=self.send1
        )
        self.send2_btn = QtWidgets.QPushButton(
            text="Send2",
            clicked=self.send2
        )
        self.send3_btn = QtWidgets.QPushButton(
            text="Send3",
            clicked=self.send3
        )

        lay = QtWidgets.QVBoxLayout(self)
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(self.send1_btn)
        hlay.addWidget(self.send2_btn)
        hlay.addWidget(self.send3_btn)
        lay.addLayout(hlay)
        
        self.serial = QtSerialPort.QSerialPort('/dev/ttyUSB0',
        baudRate=QtSerialPort.QSerialPort.Baud57600,
        parity=QtSerialPort.QSerialPort.NoParity,
        dataBits=QtSerialPort.QSerialPort.Data8,
        stopBits=QtSerialPort.QSerialPort.OneStop)
        self.serial.open(QtCore.QIODevice.ReadWrite)
        self.serial.setDataTerminalReady(True)
        #self.serial.readyRead.connect(self.readFromSerial) 
        self.serial.readyRead.connect(self.handle_ready_Read)         

    #def readFromSerial(self):
    #self.Esp1=(self.serial.readLine().data())
        
    QtCore.pyqtSlot()
    def handle_ready_Read(self):
        self.Esp1 = self.serial.readAll()
        print (self.Esp1) 
        if (self.Esp1 ==b'xAAxO2x3Cx31x19   '): # Ok = xAAxO2x3Cx31x19        
                print ("Ok")
        else:
                print ("Error")
                                    
    @QtCore.pyqtSlot()
    def send1(self):    
        # Reset,out service 
        self.serial.write(b'\xCC\x02\x3C\x55\x5F')
        # Syncro
        self.serial.write(b'\xCC\x02\x3C\x24\x2E')
        # Setup 
        self.serial.write(b'\xCC\x04\x3C\x23\x00\x10\x3F')
        # Enable
        self.serial.write(b'\xCC\x02\x3C\x12\x1C')
        
    @QtCore.pyqtSlot()
    def send2(self):
        # value  
        self.serial.write(b'\xCC\x04\x3C\x34\x00\x05\x45')
        self.step1=1
        
    @QtCore.pyqtSlot()
    def send3(self):
        # Confirm Ok 
        self.serial.write(b'\xCC\x02\x3C\x22\x2C')    
        
if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

输出:

b'\xaa\x02'
Error
b'<1\x19'
Error

十六进制数据发送

xAAxO2x3Cx31x19

我尝试了不同的阅读方式都给出了相同的结果

我收到以下信息

b'\xaa\x02'
b'<1\x19'

正确的数据是:

b'xAAxO2x3Cx31x19
python qtserialport
1个回答
0
投票

读数正确。您对它的解释有两个问题:

  1. 读取的数据如何表示
  2. 读取的数据如何分成几部分

如果你查ascii表,你会发现x3C就是字符“<" and x31 is the character "1". Try

print(self.Esp1.hex())
”才能看到。

另一个问题是您收到的不是一封电报而是两封。这就是与预期二进制字符串的比较失败的原因。您需要收集数据,直到收到预期的字节数。您不能指望一次性输入所有数据。

© www.soinside.com 2019 - 2024. All rights reserved.