2016-04-18 7 views
-1

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やデータが変更された場合、チェックサムがあまりにも変化します)

+2

バッファに書き込んだバイト数を追跡​​し、残りの部分を無視するだけです。 – user3386109

+0

、またはこれを行う必要があるかどうかはわからないので、必要に応じて、メッセージの末尾と配列の最後の間の値をゼロにするために追跡されたサイズを使用することができます –

+0

つまり、ハードウェアのバッファに書き込まれるバイト数はわかりません。 (以前の長さだけが読み込まれます) – morcibacsi

答えて

0

をあなたに利用可能な標準オプションが含まれます:

  1. 固定サイズのメッセージを。 30バイトのMAXサイズの代わりに、すべてのメッセージを一定のサイズ(多分30)にして、それ以上のチェックサムを計算します。この方法では、バッファ全体が上書きされます。

  2. サイズを報告するヘッダー情報を含むメッセージを開始します。いくつかの実装では、ヘッダーにチェックサムを含めると、数ビットを節約できます。

  3. 読み込み時にバッファをクリアします。あなたは時間がかかるためにこれが気に入らないと言っていますが、あなたはある意味で正確な税金を支払わなければなりません。

  4. パッドが0または何らかのタイプの着信メッセージである場合guard bytes。 (user3386109のコメントに関連して、バッファに書き込んだバイト数を記録しておき、それ以外は無視しなければなりません。

これですべての作業を完了できます。あなたのシステム設計と制限についてもっと知らなくても、私は別のものを推薦することはできません。サイクルを最小限に抑えるために

+0

私は質問にいくつかの説明を追加しました(または私はそう望みます)。私が残念ながら書いたように、メッセージのサイズとフォーマットは制御できないので、1と2が交差します.3つ目は解決策ですが、遅すぎます。 Number forも可能ですが、プロトコルで使用されていないバイトの組み合わせを検索する必要があります。 – morcibacsi

0

、私はこのアプローチを取る:

データは、バッファ/レジスタに入った後、それらを読んでループを開始します。 バイトがゼロであるかどうかのテスト '読み取り/移動'データバイトがゼロでない場合は、その位置をゼロに設定します。 バッファ/レジスタを介して継続します。 バイトがゼロの場合、ループを中断します。

この方法でバッファ/レジスタの内容を一度だけテストします。バイト数のカウントを維持する必要はなく、「ゼロに設定」ステップの数を最小限に抑えることができます。