Я не программист на Python, но я скорее разработчик электронных схем, но на этот раз я должен обработать некоторые необработанные данные, отправленные микроконтроллером через порт RS232 в сценарий Python (который вызывается скриптом PHP).Обработка необработанных данных, считываемых из последовательного порта с помощью последовательной библиотеки Python?
Я потратил немало часов, пытаясь определить наилучшие способы чтения необработанных байтов из последовательного (RS232) порта с использованием Python, и я получил результаты, - но я хотел бы, чтобы кто-то мог прояснить некоторые несоответствия, которые я заметил во время исследования и вот они:
1:
Я вижу много людей, которые задавали подобный вопрос был задан ли они с помощью serial
или pySerial
модуль и как они устанавливают серийный библиотеку. Я могу только сказать, что я действительно не знаю, какой модуль я использую, поскольку модуль работал из коробки. Где-то я читал serial
и pySerial
- это то же самое, но я не могу найти, верно ли это. Все, что я знаю, я использую Python 2.7.9 с ОС Raspbian.
2:
Я прочитал есть read()
и readline()
метод для чтения из последовательного порта, но в pySerial API docs нет упоминания о методе readline()
. Более того, я обнаружил, что аргумент «количество байтов для чтения» может быть передан методу readline()
, а также методу read()
(и работает так же, ограничивая количество прочитанных байтов), но я не могу обнаружить, что это документально ,
3:
При поиске, как определить, если все данных из буфера RS232 считаны я here нашел следующий код:
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
после чтения l аст байты из буфера, и я был в состоянии обнаружить пустой буфер только с помощью следующего кода:
while True:
c = rs232.read()
if len(c) == 0:
break
print int(c.encode("hex"), 16), " ",
, так что я не уверен, если код, который не работает для меня в какой-то последовательной библиотеке, другие это мое. Мой код openinig порт является КСТАТИ:
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
. Поскольку «raw bytes» может содержать 0x00
, может кто-то подтвердить, что это не проблема в отношении чтения байтов в строковой переменной Python? Насколько я понимаю, это должно хорошо работать, но я не уверен на 100%.
ли «Да вы можете, но 0 байт в строке.», Средний: ". Да, вы можете, но * не * нулевых байтов в строку? То, что я хотел бы знать, - это, например, '0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a', полученных от RS232 и назначенных строковой переменной, могут вызвать проблемы. Насколько я понимаю, внутреннее строковое представление представляет собой строки C с нулевым завершением, но я не могу найти, могут ли нули быть сохранены в представлении высокого уровня, тем не менее, внутреннего представления. –
Внутреннее представление строк в обычном Python, которое мы используем в Linux/Windows, не завершено nul. Вы можете поместить любые значения в строку. – barny
Это означало бы это [проголосовавший anwer] (http://stackoverflow.com/a/24409793/1324175), говорящий: '* Внутри, самая популярная реализация Python написана на C, поэтому, возможно, существует NULL-terminated где-то под капотом. * ', не так? –