0

シリアル データの受信パケットを読み取るクラスを作成しています。パケットは、ヘッダーと一部のデータでレイアウトされ、その後に 2 バイトの CRC が続きます。

また、送信するパケットを作成できるクラスも作成しました。このクラスには GenerateCRC() メソッドがあり、呼び出し元が他のメソッドへの呼び出しを介して構築したパケットの CRC を計算できるようにします。GenerateCRC() 呼び出しは、パケット ヘッダーとデータが正しく設定された後にのみ呼び出されることを意図しています。その結果、このメソッドは for ループでパケットを反復処理し、この方法で CRC を計算します。

パケットを読み取るコードを書いているので、CRC を計算してパケットを検証する必要があります。以前の「ビルダー」クラスを可能な限り再利用しようとしていますが、パケットを読み込んでいるときにそれをメモリに保存したいので、そのための最善の方法は「ビルダー」クラスを使用することです。ただし、CRC の計算で問題が発生しました。

私が検討している主なアプローチは 2 つありますが、長所と短所を比較検討してアプローチを決定するのに苦労しています。ここに私の2つの選択肢があります:

  1. バイトを読み込んだときに CRC を計算します。読み込んでいるデータはキューにプッシュされるため、バイトを 1 つずつポップします。実行中の「合計」CRC を保持し、最後のデータ バイトが読み込まれるとすぐに計算を終了します。

  2. 完全なパケットを読み取った場合にのみ、CRC を計算します。この場合、現在の合計を保持する必要はありませんが、パケットを再度反復処理する必要があります。これにより、以前に作成したコードを再利用できることに注意してください。

現在、私はオプション1に傾いており、「ビルダー」と「リーダー」の間の共通機能を別のヘッダーファイルに移動しています。ただし、コードが少しごちゃごちゃになるので、最初のオプションがパフォーマンスの点で実際に優れていることを確認したいと思います。

助けてくれてありがとう。

4

1 に答える 1

0

私ならDoor #2を選びます。これにより、両端で同一のコードを使用することでコードの検証がより簡単になり、一度に 4 バイトまたは 8 バイトを処理するより高速な CRC アルゴリズムを使用できるようになります。

于 2013-10-01T15:57:08.493 に答える