Кодировать / декодировать данные с последовательного порта RS232 - PullRequest
1 голос
/ 24 марта 2020

Это первый раз, когда мне приходится подключаться к устройству через последовательный порт RS232 для чтения / записи данных, и я застрял в процедурах кодирования / декодирования.

Я делаю все в Python 3 с использованием библиотеки " pyserial ". Вот что я сделал до сих пор:

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'

, и вот где я застрял. Я не знаю, как это интерпретировать. Прикрепленное изображение из таблицы данных, которая объясняет, что должны представлять выходные данные.

enter image description here

В таблице указано, что поля в байтах с 98 по 164 пусты «для устройства у меня есть. Может ли кто-нибудь помочь мне понять, что нужно сделать, чтобы преобразовать вывод ser.read_until() в форму, которая «читаема человеком» и представляет данные на изображении? Мне не нужно, чтобы кто-то писал код для меня, но я даже не уверен, с чего начать. Опять же, я делаю это впервые, так что я немного растерялся.

Ответы [ 2 ]

2 голосов
/ 24 марта 2020

Если вы пытаетесь записать один байт с шестнадцатеричным значением 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]

и т. Д.

1 голос
/ 26 марта 2020

Это не ответ, а конкретная идея @ozangds (может сэкономить вам время при наборе текста):

def decode_bytes(data, start, stop):
    return data[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'
...