@illiario
безработный

Как корректно разобрать последовательность байт из COM-порта в python?

Добрый день всем!

Читаю информацию из COM-порта. Все вроде нормально, но иногда проскакивают проблемы.
Читаю два слова по адресу F016h (b'\x01\x03\xF0\x16\x00\x02\x16\xCF')
Например, в ответ приходит: b'\x01\x03\x04\x06PUU\x05\xc5'
Но я знаю, и вижу, что должно приходить b'\x01\x03\x04\x06\x50\x55\x55\x05\xc5', так как параллельно слушаю этот COM-порт, и там должно быть (все привожу в hex): 01 03 04 06 50 55 55 05 C5.
Мне понятно, что символ P это 50h, а U - 55h в Юникоде. Т.е. получаю я все верно.
Таким образом, вопрос формулируется так: как получить из последовательного порта последовательность байт, а не вперемешку байт и Юникод?

Интерпретатор Python 3.1, библиотека serial
Код:
try:
ser = serial.Serial(port)
ser.baudrate = 19200
ser.timeout = 0.2
ser.parity = PARITY_ODD
ser.stopbits = STOPBITS_ONE

ser.write(b'\x01\x03\xF0\x16\x00\x02\x16\xCF') # запрос
a = ser.read(10)
print(a)
except serial.SerialException:
print('Ошибка...')

По коду переменная a - это bytes, но к ней .hex применяется с ошибкой, так как в ней ни хрена не bytes.
  • Вопрос задан
  • 556 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Но почему каша в serial, и как его ответ сделать только bytes без исключения, требует размышления и осознания. Ведь переменная a - это bytes, и binascii.hexlify(a) это тоже bytes...

Потому что никакой каши нет. Ответ уже только bytes.
Просто когда выкидывашеь их в консоль, питон (точнее, метод __str__() класса bytes) пытается их представить "как можно читабельнее", т.е. пробует декодировать как ascii-строку что получится, а что не получится, представляет escape-последовательностями \x??.
Доказать легко:
b1 = bytes([1,2,3])
print(b1)  # b'\x01\x02\x03'
# начиная с Python 3.8 можно указать разделитель в методе hex()
print(b1.hex(' ')) # 01 02 03

b2 = bytes([0x57, 0x54, 0x46])
print(b2)  # b'WTF'
print(b2.hex(' ')) # 57 54 46

Как видим, работает идентично
Ответ написан
Комментировать
@illiario Автор вопроса
безработный
В общем, решение подобрал такое:
библиотека binascii, функция hexlify.
Но почему каша в serial, и как его ответ сделать только bytes без исключения, требует размышления и осознания. Ведь переменная a - это bytes, и binascii.hexlify(a) это тоже bytes...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы