我正在使用Python库与传感器进行ANT+无线通信。通信是通过与ID配对完成的,ID的长度为4-5位数字。在我测试的其中一个设备的ID为"00625“之前,一切都很正常。
追踪代码,问题的来源是用于对ANT+协议消息的字节进行编码和解码的结构打包/解包函数。
>>> from struct import *
>>> pack(b'<H', 11977)
'\xc9.'
>>> unpack(b'<H', '\xc9.')
(11977,)
>>> pack(b'<H', 625)
'q\x02'
>>> unpack(b'<H', 'q\x02')
(625,)
>>> pack(b'<H', 00625)
'\x95\x01'
>>> unpack(b'<H', '\x95\x01')
(405,)因此,当我打包ANT ID的11977或625时,然后将它们解包,我得到的就是我打包的内容。
然而,当我打包ANT ID 00625,然后将其解包时,我得到的是405.不知道我该如何处理这个问题,这样我才能正确地打包00625。
发布于 2020-03-14 20:09:26
是的,我使用的是Python 2,这意味着前导零会使int被解释为八进制。深入研究消息是如何发送的,我弄清楚了,我没有传递前导零,而是只传递了'625‘作为ID,并将pack函数参数更改为用两个填充字节填充。这就完成了任务,只需添加一个条件,其中任何传递的少于3位的int都会被填充,如下所示:
>>> from struct import *
>>> pack(b'<H', 625)
'q\x02'
>>> pack(b'<xxH', 625)
'\x00\x00q\x02'因此,我在消息模块上创建了一个条件,根据ID的大小使用其中一个:
def deviceNumber(self, device_number):
if len(str(device_number)) > 3 :
self._payload[1:3] = pack(b'<H', device_number)
else :
self._payload[1:3] = pack(b'<xxH', device_number)也许有更好的方法,但它是有效的,这已经足够好了!
https://stackoverflow.com/questions/60674961
复制相似问题