我正在尝试用micropython来解码能帧。我错过了python3.x中的许多函数。我从MCP2515的Rx缓冲区获得8个十六进制长字节。关于信息,我使用的是openMV IDE。我想提取第一和第二是整数,第三和第四是另一个,等等.
在我的研究过程中,我发现了一个将字节转换为有符号整数的函数(因为sign=True参数不是在from_byte函数中实现的)。主要的问题是在其他python论坛上提供的解决方案只是针对pc的python3.x,而不是micropython,很多解决方案的结尾都是“函数不存在”。
byte = b'\x12\x34\x56\x78\x9A\xBC\xDE\xFF'
def byte2int(bList, signed:bool=False):
if signed :
r = 0
for i in range(2):
d = 32 - ((i + 1) * 8)
r += bList[i] << d
return r
else : return int.from_bytes(byte, 'big')此外,我认为当打印(B)返回时,我不能信任打印函数:
> print(b)
b'\x124Vx\x9a\xbc\xde\xff'我不明白为什么3消失了,在4之后被“V”取代!有时,当我打印非十六进制字符的罐头帧时,我的MCP2515会返回一些“AC.26”、“?”、“.”、‘’>、'<‘或'=’。我的假设是,这些是损坏的帧或SPI传输。
拜托,有人能帮我理解为什么micropython会给我这些混乱的结果吗?
非常感谢你的帮助。
发布于 2022-09-22 14:49:18
我写了些东西。也许不是最好的优化,但我必须处理比Python3.x更高级的micropython
这是一个解决方案(当然不是最优的)。但它似乎奏效了。
byte = b'\xFF\xC8\x56\x78\x9A\xBC\xDE\xFF'
byte2 = b'\x00\x00\x00@\x00\x00\x00\x00'
def extract(trame, signed:bool=False):
r = [0,0,0,0]
trame = [int(x) for x in bytearray(byte)]
for i in range(len(trame)/2):
val = (trame[i*2]<<8)+trame[i*2+1]
if signed and val > 0x8000 :
r[i] = -(65535-int(val)+1)
else :
r[i] = int(val)
return r
print(extract(byte, True))https://stackoverflow.com/questions/73815291
复制相似问题