2013-06-22 2 views
2

Я пытаюсь проверить данные, полученные от последовательного порта, и не может показаться, что это правильно. Мне нужно проверить, если первый байт, полученный в пакете 0xBE таким образом:проверка байтов из последовательного порта

#ser is instance of pyserial serial object 
data=ser.read(5) 
print "serial RX: " + binascii.b2a_hex(data) 
if data[0] != 0xBE: 
    print"wrong value" 

всегда печатает:

serial RX: beef000008 
wrong value 

Несмотря на то, двоичная в ASCii печати показывает, что правильное значение было получено.

Где я ошибаюсь в этой действительно основной задаче?

Thanks, Robin.

+0

ну почему бы вам не распечатать данные [0], данные [1], данные [2] и данные [3] и посмотреть, что там? –

+0

если я печатаю данные [0] Я получаю символ 3/4, который является chr (0xBE), поэтому это правильное значение (как подтверждено также bin2ascii), но serial.read() должен возвращать объект байтов в python> = 2.4 согласно документам. это действительно строка? – user2512377

+0

Я думаю, что байты - это строки. просто прочитав об этом сейчас. но в любом случае исправление для вашей ситуации заключается в сравнении данных [0] с chr (0xbe), то :) –

ответ

3

из pyserial's documentation:

Changed in version 2.5: Returns an instance of bytes when available (Python 2.6 and newer) and str otherwise. 

так я проверил:

>> bytes(0xbe) == 0xbe 
False 

но если вы преобразовать его в целое:

>> int(bytes(0xbe)) == 0xbe 
True 

как эта stackoverflow question показывает, то bytes тип включен [PEP-3137 3]. Это как bytearray для python3, но просто псевдоним для str в python2.

Итак, в основном, просто обрабатывайте вывод pyserial как str, пока вы делаете код python2.