【发布时间】:2020-03-23 23:55:11
【问题描述】:
这是我第一次必须通过 RS232 串行连接到设备以读取/写入数据,我被困在编码/解码程序上。
我正在使用库“pyserial”在 Python 3 中做所有事情。这是我到目前为止所做的:
import serial
ser = serial.Serial()
ser.port = '/dev/ttyUSB0'
ser.baudrate = 115200
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.timeout = 3
ser.open()
device_write = ser.write(bytearray.fromhex('AA 55 00 00 07 00 12 19 00'))
device_read = ser.read_until()
连接/通信似乎按预期工作。 device_read 的输出是
b'M1830130A2IMU v3.2.9.1 26.04.19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x0527641\x00\x00\x00IMHF R.1.0.0 10.28.2018 td: 6.500ms\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00'
这就是我卡住的地方。我不知道如何解释这个。附件是数据表中的一张图片,它解释了输出应该代表什么。
对于我拥有的设备,数据表显示“字节 98 到 164 中的字段为空”。有人可以帮助我了解将ser.read_until() 的输出转换为“人类可读”并表示图像中数据的形式需要做什么吗?我不需要有人为我编写代码,但我什至不知道从哪里开始。同样,这是我第一次这样做,所以我对发生的事情有点迷茫。
【问题讨论】:
-
正在读取的数据看起来不正确,因此可能存在通信问题。
-
啊……你说得对。当我只发送 1 个字节时,“命令”要求写入 9 个字节(我没有包括标题、校验和等字节)。我更新了输出
-
很高兴听到 - 那么,您现在知道如何解码信息了吗?
-
如果我这样做
device_read[0:8].decode('ascii'),我会得到'M1830130'。如果我这样做device_read[8:48].decode('ascii'),我会得到'A2IMU v3.2.9.1 26.04.19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'。我看不出这是如何“解码”为“人类可读”的形式的?换句话说,为什么我的输出中还有\x00之类的东西?device.read[48]的输出也等于 (b'\x02'),它给出 2 而不是数据表中定义的 1 或 0。这让人相信要么我做错了什么,要么数据表不正确(不太可能)。 -
\x00 只是 0,这意味着 null,这是您不知道长度的字符串的标准结束标记。你可以像这样剥离它:``` ID_fw = device_read[8:48].decode('ascii') first_zero = ID_fw.find('\x00') if first_zero >= 0: ID_fw = ID_fw[0:first_zero] ```
标签: python python-3.x serial-port pyserial