2017-01-24 15 views
0

私は、srxlパッケージの検証のためにクリーンフライトクワトロコプターファームウェアで採用されているcrc16の検証を理解しようとしています。CRC16の生成と確認

SRXLは、単一のシリアルラインを介してサーボ値を送信するためのシンプルなシリアルプロトコルです。

protocol structure

CRC16は次の関数によって検証されています:私はこれがどのように動作するか理解していない

//srxlFrameLength is the package length 
//srxlFrame is the received package buffer 
uint16_t crc_calc = 0; 
for (i = 0; i < srxlFrameLength; i++) { 
    crc_calc = crc16_CCITT(crc_calc, srxlFrame[i]); 
} 
if(crcCalc == 0){ //package is valid } 

パッケージ構造は、このようなものです。これを実装するなら、私は保存されたcrcに達するまでパッケージのすべてのバイトについてcrc iterativlyを計算し、次に保存されたcrcと比較します。なぜこの実装はうまくいくのでしょうか?

私はまた、送信側のパッケージジェネレータコードを実装したいと思います。 このようなCRCの生成を実現することが可能になります:CRCは、メッセージの最後に適切に保存されている場合は、事前に

uint16_t crc_calc = 0;  
for(int i = 0; i < packetLength; ++i){ 
    crc_calc = crc16_CCITT(crc_calc, packet[i]); 
} 
//concat calculated crc16 to packet here. 

おかげで、

マルテ

答えて

4

、それが財産を持っていますエラーのないと仮定して、メッセージのCRCおよび連結されたCRCが定数であることを示す。 CRCの定義に応じて、その定数はゼロになります。

理由は、CRCは、本質的にNはビットのCRC長さメッセージ倍X Nの多項式除算の余りであることです。メッセージにCRCを追加すると、最後のメッセージはnのゼロと置き換えられ、残りの部分は除外されます。 (バイナリ多項式の負数は多項式であることに注意してください。それ自身の排他的論理和がゼロであるためです)。メッセージに付加されたCRCの結果。

+0

ありがとう、それは意味があります。私は今、CRCの詳細を見るだろうと思う。 – Malte

関連する問題