从 can 帧中读取 12 位小端整数

Reading 12bit little endian integers from can frame

我正在阅读来自 python 的一系列 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 包也只支持全字节位串。

我显然对二进制理解不够透彻,无法通过直接操作位来做到这一点,因为我一直在竭尽全力试图获得合理的值...

我能够使用 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)