私は、srxlパッケージの検証のためにクリーンフライトクワトロコプターファームウェアで採用されているcrc16の検証を理解しようとしています。CRC16の生成と確認
SRXLは、単一のシリアルラインを介してサーボ値を送信するためのシンプルなシリアルプロトコルです。
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.
おかげで、
マルテ
ありがとう、それは意味があります。私は今、CRCの詳細を見るだろうと思う。 – Malte