2017-11-17 39 views
0

私は、Pythonから一連のCANバスフレームを読み取っています。カンフレームから12ビットリトルエンディアン整数を読み取る

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

各値は、符号なし整数で、リトルエンディアンバイト順で:「9819961F9FFF7FC1」およびIは、以下のように、各フレームの値がレイアウトされている知っています。私が苦労しているところは、12ビットの信号をどのように処理するか、これがリアルタイムで実行されるように高速に処理する方法です。私が理解する限り、struct.unpackは1,2,4,8バイトの整数しかサポートしていません。 Bitstringパッケージでは、エンディアンを指定すると、全バイトビットストリングもサポートされます。

私ははっきり...バイナリ

答えて

0

を私は賢明な値を取得しようとしている私の髪を引き裂くされているので、直接ビットを操作することによってそれを行うには十分理解していない私は正常にフレームをデコードすることができましたし、適度に速く、bitstructライブラリでは、以下のコードのように任意のビット数の値を扱うことができます。

しかし、CAN frame layoutのように、2つの信号が同じバイトに存在する場合、16進文字の位置を入れ替えなければならないことが分かりました。私はまだ、なぜそれが動作しないのか分かりません。

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) 
関連する問題