Двоичные данные с pyserial (последовательный порт python)

Метод serial.write () в pyserial, похоже, отправляет только строковые данные. У меня есть массивы вроде [0xc0,0x04,0x00], и я хочу иметь возможность отправлять / получать их через последовательный порт? Есть ли какие-то отдельные методы для необработанного ввода-вывода?

Я думаю, что мне может потребоваться изменить массивы на ['\ xc0', '\ x04', '\ x00'], тем не менее, нулевой символ может создать проблему.


person Atilla Filiz    schedule 23.01.2009    source источник


Ответы (3)


Вам нужно преобразовать ваши данные в строку

"\xc0\x04\x00"

Нулевые символы не являются проблемой в Python - строки не заканчиваются нулем, нулевой байт ведет себя так же, как другой байт "\x00".

Один из способов сделать это:

>>> import array
>>> array.array('B', [0xc0, 0x04, 0x00]).tostring()
'\xc0\x04\x00'
person dF.    schedule 23.01.2009

Альтернативный метод без использования модуля array:

def a2s(arr):
    """ Array of integer byte values --> binary string
    """
    return ''.join(chr(b) for b in arr)
person Eli Bendersky    schedule 15.08.2009
comment
карта может быть еще быстрее: def a2s(arr): return ''.join(map(chr,arr)) - person RufusVS; 20.03.2015

Я столкнулся с аналогичной (но, возможно, еще более серьезной) проблемой, когда мне приходилось отправлять управляющие биты через UART из скрипта Python для тестирования встроенного устройства. Мое определение данных было «поле1: 8 бит, поле2: 3 бита, поле3 7 бит» и т. Д. Оказывается, вы можете создать для этого надежный и чистый интерфейс, используя библиотеку BitArray. Вот фрагмент (без последовательной настройки)

from bitstring import BitArray

cmdbuf = BitArray(length = 50)     # 50 byte BitArray
cmdbuf.overwrite('0xAA', 0)       # Init the marker byte at the head

Вот где он становится гибким. Приведенная ниже команда заменяет 4 бита в позиции 23 на 4 переданных. Обратите внимание, что он принимает двоичное битовое значение, заданное в строковой форме. Таким образом я могу установить / очистить любые биты в любом месте буфера, не беспокоясь о переходе на значения в соседних байтах или битах.

cmdbuf.overwrite('0b0110', 23)

# To send on the (previously opened) serial port 
ser.write( cmdbuf )
person jbartas    schedule 16.11.2019