我有以下配置: 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
读数正确。您对它的解释有两个问题:
如果你查ascii表,你会发现x3C就是字符“<" and x31 is the character "1". Try
print(self.Esp1.hex())
”才能看到。
另一个问题是您收到的不是一封电报而是两封。这就是与预期二进制字符串的比较失败的原因。您需要收集数据,直到收到预期的字节数。您不能指望一次性输入所有数据。