Я не программист на Python, а скорее разработчик электронных схем, однако на этот раз я должен обработать некоторые необработанные данные, отправленные микроконтроллером через порт RS232 в сценарий Python (который вызывается сценарием PHP).
Я потратил довольно много часов, пытаясь определить лучшие способы чтения необработанных байтов из последовательного (RS232) порта с использованием Python, и я получил результаты, но я хотел бы, чтобы кто-нибудь мог прояснить некоторые несоответствия, которые я заметил во время исследования, и вот они являются:
1:
Я вижу, что многих людей, задававших аналогичный вопрос, спрашивали, используют ли они модуль serial
или pySerial
и как они устанавливали последовательную библиотеку. Могу только сказать, что я действительно не знаю, какой модуль я использую, поскольку модуль работал «из коробки». Где-то я читал serial
и pySerial
это одно и то же, но я не могу найти, правда ли это. Все, что я знаю, это то, что я использую Python 2.7.9 с ОС Raspbian.
2:
Я читал, что есть методы read()
и readline()
для чтения из последовательного порта, но в pySerial API docs не упоминается readline()
метод. Более того, я обнаружил, что аргумент «количество байтов для чтения» может быть передан в метод readline()
, а также в метод read()
(и работает таким же образом, ограничивая количество байтов для чтения), но я не могу найти это для документирования. .
3:
При поиске способа определить, были ли прочитаны все данные из буфера RS232, у меня есть здесь нашел следующий код:
read_byte = ser.read()
while read_byte is not None:
read_byte = ser.read()
print '%x' % ord(read_byte)
но это приводит к:
Traceback (most recent call last):
File "./testread.py", line 53, in <module>
read_all()
File "./testread.py", line 32, in read_all
print '%x' % ord(read_byte)
TypeError: ord() expected a character, but string of length 0 found
после чтения последнего байта из буфера, и я смог обнаружить пустой буфер только с помощью следующего кода:
while True:
c = rs232.read()
if len(c) == 0:
break
print int(c.encode("hex"), 16), " ",
поэтому я не уверен, что код, который у меня не сработал, предназначен для какой-то библиотеки последовательного интерфейса, отличной от моей. Мой код для порта openinig - BTW:
rs232 = serial.Serial(
port = '/dev/ttyUSB0',
baudrate = 2400,
parity = serial.PARITY_NONE,
stopbits = serial.STOPBITS_ONE,
bytesize = serial.EIGHTBITS,
timeout = 1
)
4:
Данные, которые я получаю от микроконтроллера, имеют следующий формат:
0x16 0x02 0x0b 0xc9 ... 0x0d 0x0a
Это some raw bytes + \r\n
. Поскольку «сырые байты» могут содержать 0x00
, может ли кто-нибудь подтвердить, что чтение байтов в строковую переменную Python не является проблемой? Насколько я понимаю, это должно работать, но я не уверен на 100%.