2

シリアル ポートからパケットを読み取るアプリケーションを作成したいと考えています。 Stack Overflow に関するさまざまな質問を調べてみましたが、boost::asio を使用するのがよい方法のようです。

ただし、これまでシリアル ポートや boost::asio を実際に使用したことがないため、バイト ストリーム内のパケットを「検索」する方法に関する高レベルのガイダンスを探しています。

シリアル ポートから送信される各パケットは、13 バイトで構成されます。残念ながら、パケットにはいかなる種類のヘッダー フラグも含まれていませんが、最後のバイトには前の 12 バイトのチェックサムが含まれています。

シリアル ポートから読み取りを開始した場合、取得する最初のバイトが必ずしもパケットの最初のバイトになるとは限りません。実際、最初に読み取ったバイトは、パケットの途中にある可能性があります。

  • メイン スレッドが定期的にシリアル ポートから一連のパケットを読み取り、それらをバッファに格納するように計画しています。

  • 2 番目のスレッドが定期的にバッファをスキャンし、有効なチェックサムを探します。有効なチェックサムが見つかったと仮定すると、チェックサム バイトと前の 12 バイトが有効なパケットを形成することを意味します。

これは有効なアプローチですか?

この問題にアプローチするより良い方法はありますか?

4

1 に答える 1

3

実世界のシリアル プロトコルでは、リードイン シーケンスを使用して同期を可能にすることでこれを解決します。つまり、境界を明確に識別するバイトまたはバイト シーケンスです。前にあるものを捨てて、目に入るまで読まなければなりません。有効なチェックサムで 12+1 を探すだけでうまくいくと思います。

于 2013-01-26T21:50:11.130 に答える