这是我第一次必须通过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()
的输出转换为“人类可读”的形式并表示图像中数据的方法吗?我不需要别人为我编写代码,但是我什至不知道从哪里开始。再次,这是我第一次这样做,所以我对正在发生的事情有点迷茫。
[如果您尝试写入一个十六进制值12(十进制18)的单个字节,我相信您需要做的是ser.write(bytes([0x12]))
,它等效于ser.write(bytes([18]))
。
看来您的输出是154个字节而不是98个字节,并且其中很多是人类无法读取的。但是,如果您确实有图表中描述的数据,则可以像这样将其分解:
ID_sn = device_read[0:8].decode('ascii')
ID_fw = device_read[8:48].decode('ascii')
Press_Sens = device_read[48]
依此类推。
这不是答案,只是@ozangds的想法充实了(可能省去您一些打字的时间:]
def decode_bytes(data, start, stop):
return data[start: start+stop+1].decode('ascii').rstrip('\x00')
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'
ID_sn = decode_bytes(device_read, 0, 7)
ID_fw = decode_bytes(device_read, 8, 47)
Press_sens = device_read[48]
IMU_type = device_read[49]
IMU_sn = decode_bytes(device_read, 50, 57)
IMU_fw = decode_bytes(device_read, 58, 97)
label_fmt = '{:>10}: {!r}'
print(label_fmt.format('ID_sn', ID_sn))
print(label_fmt.format('ID_fw', ID_fw))
print(label_fmt.format('Press_sens', Press_sens))
print(label_fmt.format('IMU_type', IMU_type))
print(label_fmt.format('IMU_sn', IMU_sn))
print(label_fmt.format('IMU_fw', IMU_fw))
输出:
ID_sn: 'M1830130'
ID_fw: 'A2IMU v3.2.9.1 26.04.19'
Press_sens: 2
IMU_type: 5
IMU_sn: '27641'
IMU_fw: 'IMHF R.1.0.0 10.28.2018 td: 6.500ms'