从can

时间:2017-11-17 16:31:54

标签: python python-2.7 binary endianness can-bus

我正在读取来自python-can的一系列CAN BUS帧,表示为十六进制字符串,例如'9819961F9FFF7FC1'我知道每个帧中的值如下所示:

Signal Startbit Length
A      0        8
B      8        4
C      12       4
D      16       12
E      28       12
F      40       16
G      56       4

每个值都是无符号整数,字节顺序很少。我正在努力的是如何处理12位信号,以及如何快速执行它,因为它将实时运行。据我所知,struct.unpack只支持1,2,4和8字节整数。当您指定字节序时,Bitstring包也仅支持全字节位串。

我显然不能很好地理解二进制文件,因为我一直在试图获得合理的价值,因为我一直在试图获取合理的价值......

1 个答案:

答案 0 :(得分:0)

我能够使用bitstruct库成功地并且合理地快速解码帧,该库可以处理任意位数的值,如下面的代码所示。

但是我发现如果同一个字节上存在两个信号,我也必须交换十六进制字符的位置,如CAN frame layout中所示。我仍然不确定原因,但确实有效。

swapped_frame = frame[0:2] + frame[3] + frame[2] + frame[4:6] + frame[7] + \
frame[6] + frame[8:]
ba = bytearray(swapped_frame.decode('hex'))
A,B,C,D,E,F,G = bitstruct.unpack('<u8u4u4u12u12u16u4', ba)