2016-10-22 1 views
0

Я не программист на 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%.

ответ

1

PySerial работает для меня, хотя не использовал его на Pi.

3: Read() возвращает строку - это будет нулевая длина, если данные не прочитаны, поэтому ваша более поздняя версия верна.Поскольку строка не является символом, вы должны использовать, например. ога (read_byte [0]), чтобы напечатать номер, соответствующий первый символ (если длина строки> 0) Вашей функции:

while True: 
    c = rs232.read() 
    if len(c) == 0: 
     break 
    print int(c.encode("hex"), 16), " ", 

нужно что-то добавлением аккумулировать чтение данных, в противном случае она брошена прочь

rcvd = "" 
while True: 
    c = rs232.read() 
    if len(c) == 0: 
     break 
    rcvd += c 
    for ch in c: 
     print ord(ch), " ", 

4: Да, вы можете получить и поставить NUL (0x00) байт в строке. Например:

a="\x00" 
print len(a) 

напечатает длина 1

+0

ли «Да вы можете, но 0 байт в строке.», Средний: ". Да, вы можете, но * не * нулевых байтов в строку? То, что я хотел бы знать, - это, например, '0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a', полученных от RS232 и назначенных строковой переменной, могут вызвать проблемы. Насколько я понимаю, внутреннее строковое представление представляет собой строки C с нулевым завершением, но я не могу найти, могут ли нули быть сохранены в представлении высокого уровня, тем не менее, внутреннего представления. –

+0

Внутреннее представление строк в обычном Python, которое мы используем в Linux/Windows, не завершено nul. Вы можете поместить любые значения в строку. – barny

+0

Это означало бы это [проголосовавший anwer] (http://stackoverflow.com/a/24409793/1324175), говорящий: '* Внутри, самая популярная реализация Python написана на C, поэтому, возможно, существует NULL-terminated где-то под капотом. * ', не так? –