2016-11-02 9 views
0

仕様に定義されているシリアルポートと通信しようとしています。バイト配列フ​​レームを構築してチェックサムを計算する方法

ser = serial.Serial("/dev/ttyUSB0", baudrate="115200") 

frame = bytearray([ 
    0x00, 0x00, #frame control (2 bytes) 
    0x00, 0x00, #machine id (2 bytes) 
    0x07, # number of bytes in data field 
    0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself 
    0x00, 0x0A #checksum 
]) 

ser.write(frame) 
ser.close() 

コードはエラーなく実行され、別のスクリプト/プロセスで同じポートを監視しています。デバイスは、成功したフレームを受信するとフレームを返すと想定されます。

この例では、私は手動でのように定義されるチェックサム計算した:...データをFSN.msbからreangingフレーム全体にわたって計算

二バイトチェックサム、まずMSBを、[DSIZE] 。チェックサムは、バイトの単純な16ビット符号なし加算で計算されます。

この場合、チェックサムを除いて、フレーム内のすべてを加算すると、合計なしで。それを加えれば、合計は20です。

このデバイスは故障している可能性がありますので、これは作業するのが難しい環境ですが、これまで誰かが私のアプローチを吟味することができたらうれしいですね。

文字通り単純なチェックサムを生成していますか、それとも別のものが必要ですか?

+0

質問とは正確には何ですか?チェックサムの役割は、実際のデータが変更されていないことを合理的に保証することです。したがって、信頼できない場合でも、すべてのバイトを単純に追加すると、その役割を果たすことができます。通常、チェックサムはペイロードのハッシュであり、より信頼性が高くなりますが、より多くの計算が必要になります。 – Guillaume

答えて

2

はい、それは簡単なことである - 普段お使いの枠に記入し、別の段階でチェックサムを追加します - に似:

In [73]: frame = bytearray([ 
    ...:  0x00, 0x00, #frame control (2 bytes) 
    ...:  0x00, 0x00, #machine id (2 bytes) 
    ...:  0x07, # number of bytes in data field 
    ...:  0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, #data field itself 
    ...:  ]) 


In [75]: checksum = sum(frame) 

In [76]: frame.extend((checksum // 256, checksum % 256)) 

In [80]: print (", ".join("\\x%02X" % v for v in frame)) 
\x00, \x00, \x00, \x00, \x07, \x01, \x01, \x01, \x00, \x00, \x00, \x00, \x00, \x0A 

は、細部に注意してください。私は2つのバイトを追加チェックサムは「ナチュラルオーダー」 - 「MSB」(最上位バイト)が最初です。あなたの仕様にあるとおりです。それはうまくいくはずです - そうでない場合は、他のフィールドのいずれかでフォーマットエラーが発生する可能性があります。

+1

Python 3.2以降、さらに優れたソリューション: 'frame.extend(sum(frame).to_bytes(2、 'big'))' https://docs.python.org/3/library/stdtypes.html#int.to_bytes – Guillaume

+0

これは本当に便利です、ありがとう。私は配列を印刷するとき、私はこのbytearrayを取得する(b '\ x00 \ x00 \ x00 \ x00 \ x07 \ x01 \ x01 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 \ n')なぜnの最後に? –

+0

ああ、印刷がバイトを直接文字などに変換しているからです。そして、.joinはそれらを16進数で表示する方法です。まだバイトのいくつかがうまくいくという正確な理由を知ることは興味深いですし、ランダムなnはそこにありますか? –

関連する問題