2016-10-01 8 views
0

Я пытаюсь распаковать данные, отправленные с моего Arduino с Pyserial. Однако код работает на Python 2.7, тот же код выходит из строя на Python 3.4, и я понятия не имею, почему. Это код.Распаковка байтов: разница в Python 2 vs 3

resp=ser.read() 
datalength=struct.unpack('<b',resp)[0] 
data=ser.read(datalength) 
temp = struct.unpack('<'+'h'*int(datalength/2),data) 
ser.flushInput() 
ser.flushOutput() 
print(temp) 

Это результирующая ошибка в Python 3.4:

temp=struct.unpack('<'+'h'*int(datalength/2),data) 
struct.error: unpack requires a bytes object of length 36 

я распечатал resp, datalength и data, чтобы увидеть, что происходит.

Resp: b'$' 
Datalength: 36 
Data: b'M>\x06l\xf6\xff\x00\x00\x14\x00w' 

Чтобы получить полный ответ, я сделал ser.readline() и он вернулся:

b'$M>\x06l\xab\xff\x13\x00O\x00b' 

Может кто-нибудь объяснить разницу на .unpacking процесса в py2 против PY3 и почему она работает на py2 и не 3?

Я пытаюсь разобрать данные из моего MultiWii, если это помогает вообще, все Multwii разбирает в py2 и не 3 ....

+0

Обратите внимание, что '.read (size)' пытается прочитать ** до ** 'size' байт. Возможно, вам просто нужно повторить, пока вы на самом деле не получили столько байтов? –

+0

Что это значит? Мог ли я сделать '.read (size + 1)' вместо этого? – aseylys

+0

'while len (data)

ответ

0

Это не является результатом версии Python. Скорее всего, потому, что read() не ждет достаточно долго для всех данных (по крайней мере, 36 байт). Попробуйте увеличить аргумент таймаута для вашего серийного объекта и посмотреть, что-нибудь изменилось:

ser = serial.Serial(port, baud, timeout=2) 

Единица измерения - секунды.