Arduinoを使用してTSS463C VANデータリンクコントローラでパケットスニッファを作成しようとしています。私は、受信したメッセージバッファのメモリロケーションと、受信できる最大データ長を割り当てることができます。それぞれ異なる長さの複数のメッセージタイプがありますが、最大長は30バイトです。残念ながら、私は受信メッセージの長さを知らないので、私は自分のバッファーとして30バイトの長さの配列を作成しました。可変長の以前のデータの残りを固定長配列で除外する
私の問題は、短いメッセージの後に長いメッセージが続くと、コントローラのレジスタに現在のメッセージの最後を過ぎてゴミが含まれていることです。具体的には、受信した前回のデータの残量。
これらのレジスタをコントローラに書き直すには時間がかかりますが、これは避けたいものです。
私の質問は、この「ゴミ」をアレイから最も速く取り除く方法です。
例:第3のメッセージに
5E 41 82 20 1F 95 6A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4D 41 83 8A 21 40 3D 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5E 41 82 20 1F 95 6A 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
^^
は、前のメッセージからのごみです。最後の2バイトはチェックサム(95 6A)なので、メッセージの一部が変更された場合でも変更されます。
更新
私はそれがパケットスニファアプリケーションですので、残念ながら私は、コントローラのレジスタに書かれているコントロールを持っていない言及したように。私はちょうど彼らの価値観を読んでいる(しかし、私が望むならそれを書くことができる)。いくつかのメッセージは長さが6バイトで、長さは最大12ですが最大長は30です。メッセージフォーマットも固定です(私はそれを制御できません)。IDバイトからいくつかのDATAバイトと2バイトのCHECKSUMで始まります。およびDATAバイト。私は考えると25種類のメッセージがあり、それぞれ長さを含まない固定ヘッダーがあります。
私は次のことについて考えていました: 起動時に、すべてのレジスタを0に設定し、定期的に読み込みを開始します。 2つの配列(previousDataとcurrentData)を宣言します。私はcurrentDataの値で前のデータを上書きします(シリアルポート経由で私のPCに送ります)。 2つの配列の要素を後方から比較します。配列の値が、現在読み込まれているメッセージが終了する場所と同じでない場所。 (IDやデータが変更された場合、チェックサムがあまりにも変化します)
バッファに書き込んだバイト数を追跡し、残りの部分を無視するだけです。 – user3386109
、またはこれを行う必要があるかどうかはわからないので、必要に応じて、メッセージの末尾と配列の最後の間の値をゼロにするために追跡されたサイズを使用することができます –
つまり、ハードウェアのバッファに書き込まれるバイト数はわかりません。 (以前の長さだけが読み込まれます) – morcibacsi