解包字节:Python 2与3的区别

时间:2016-10-01 18:11:51

标签: python-3.x arduino pyserial unpack

我试图用Pyserial解压缩从我的Arduino发来的数据。该代码适用于Python 2.7但是,相同的代码在Python 3.4上失败,我不知道为什么。这是代码。

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

我打印出respdatalengthdata,看看发生了什么。

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

为了获得完整的回复,我做了ser.readline()并返回了:

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

有人可以解释Py2与Py3中.unpacking进程的区别以及为什么它在Py2而不是3上运行?

我尝试解析Multiwii中的数据,如果有帮助的话,所有的Multwii解析都在Py2而不是3 ......

1 个答案:

答案 0 :(得分:0)

这不是Python版本的结果。这很可能是因为read()没有等待所有数据(显然是36个字节)到达的时间。尝试增加串行对象的超时参数,看看是否有任何变化,如下所示:

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

单位为秒。