組み込み機器向けのシンプルな固定長プロトコルを設計しました。各パケットはわずか 2 バイトです。
bits | 15..12 | 11..4 | 3..0 |
| OpCode | DATA | CRC4 |
「crc ベースのフレーミング」を使用します。つまり、レシーバーは 2 バイトを収集し、CRC4 を計算し、それが一致する場合、フレームは有効と見なされます。ご覧のとおり、フレームの開始またはフレームの終了はありません。
問題があります。CRC4 の推奨メッセージ長は 11 ビットですが、ここでは 12 ビットで計算されています。私が理解している限り、これは CRC エラー検出特性が低下することを意味します (ただし、どの程度かはわかりません)。
(ちなみに、誰かが CRC4 (またはその他) のコードを必要とし、それを自分で書くのに十分なスキルを持っていないと感じている場合、boost には任意の crc を計算できる非常に優れた boost::crc 関数があります)
問題は、この crc ベースのフレーミングが機能せず、フレーミング エラーが発生することです。つまり、あるメッセージの 2 番目のバイトと次のメッセージの最初のバイトが正しいメッセージを形成することがあります。
私の質問は - バイトを追加せずにフレーミングを修正する方法はありますか? その 2 バイトにすべてを詰め込むのにかなりの時間を費やしますが、そのように捨てるのはちょっと悲しいことです。ただし、オペコード フィールドにはスペア ビットがあります。
- 無線チャネルは一度に複数のパケットを「吐き出す」ことを好むため、時間ベースのフレーミングはあまり信頼できません。
- CRC4 よりもうまく機能するエラー検出方法が他にあるのではないでしょうか?
さらにバイトを追加する必要がある場合、それを行う最善の方法は何でしょうか?
- フレーム開始バイトとバイトスタッフィング (COBS など) を使用できます (+2 バイトですが、破損したメッセージをどうするかはわかりません)。
- フレーム開始ニブルを使用して、CRC を CRC8 (+1 バイト) に拡張できます。
- 他の何か?