2011-10-24 11 views
1

バイナリ出力を持つシリアルデバイスがあり、次のようにデータをキャプチャします。c#シリアルポートバイナリストリーム処理

 private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      int count = sp.BytesToRead; 
      byte[] data = new byte[count]; 
      sp.Read(data, 0, data.Length); 
      file.WriteLine(BitConverter.ToString(data)); 
     } 

データが伝わってくるとこのようになります...私はそれをデコードできるよう

06-14-F2-A1-64-2D-62-00-1A-31-00-06-14-F3-84-62-59-01-00-1A-31-00-06-14-F3-85-56-52-55-31 
1A-31-00-06-14-F4-18-04-2E-62-00-1A-31-00-06-14-F4-E3-27-5B-01-00-1A-31-00-06-14-F4-E4-1C-51-55-31 
1A-31-00-06-14-F5-71-4C-59-71-20-1A-31-00-06-14-F5-8E-A5-2E-62-00-1A-31-00-06-14-F5-F4-47-56-55-31-1A-31-00-06-14-F6-10-1A-1A-31-52-24-1A-31-00-06-14-F6-3D-40-19-70-00-1A-31-00-06-14-F6-3E-9C-4C-55-31-1A-33-00-06-14-F6-F6-11-3D-A0-00-17-B0-C8-4E-42-70-AA-00-00-59-51-1E-1A-31-00-06-14-F7-05-4A-2E-62-00-1A-31-00-06-14-F7-83-5C-56-55-31-1A-31-00-06-14-F7-99-04-5A-01-00-1A-31-00-06-14-F7-99-F8-51-55-31-1A-31-00-06-14-F8-7B-EA-2E-62-00-1A-31-00-06-14-F9-00-CE-56-01-00-1A-31-00-06-14-F9-0E-DF-51-55-31-1A-31-00-06-14-F9-F2-8B-2B-62-00-1A-31-00-06-14-FA-15-1F-1D-05-30-1A-31-00-06-14-FA-62-4D-59-01-00-1A-31-00-06-14-FA-63-41-55-55-31-1A-31-00-06-14-FA-6F-6E-1D-67-67-1A-31-00-06-14-FA-EC-50-2E-72-00-1A-31-00-06-14-FB-22-96-38-62-00-1A-31-00-06-14-FB-3B-7A-40-20-43-1A-31-00-06-14-FB-69-2E-2B-62-00-1A-31-00-06-14-FC-62-F1-2D-72-00-1A-31-00-06-14-FC-DF-D1-2E-62-00-1A-31-00-06 

ヘクスがここでの問題はありませんが、私が探していますステートメントは、1A〜で始まります31であり、設定されたバイト数の長さです。あなたが見ることができるように、この場合シリアルストリームは中流を開始するので完全なステートメントではありません。

このマーカーを探して、先頭を破棄して処理を開始するにはどうすればよいですか。また、ある時点でreadBufferがストリームを切り捨てるため、これを複数回繰り返す必要があります。

+0

はい、あなたの質問に答えました。 –

答えて

3

あなたはほぼあります。あなたの問題は、ストリーミングしているデータが塊になって、ステートメントの開始と終了の位置がずれてしまうことです。ステートメントのエンドが次のステートメントの開始を識別する1A-31によって検出されると仮定します。これが真実でない場合は、それに応じてこの答えを再解釈してください。

ここでは、半分のステートメントを含むサンプルの最初のデータでは何もできません。そこで、最初に得たデータの最初の部分が実際に1A-31で始まると仮定して始めましょう。あなたは、チャンク内の文全体を見つけることができます

  • (すなわち、あなたはその中に別の1A-31が発生した):

    は現在、2つのオプションがあります。この場合、それを食べてそれを使ってやりたいことを何でもしてください(私はStatementReceivedイベントを追加してそこに送ってください)。チャンクが完全に処理されるまでこの演習を繰り返します。

  • ステートメントはチャンク内に完全には含まれていません。すでに取得したデータを一時バッファにコピーし、次のport_DataReceivedコールを待ちます。

目のオプションがそうであった場合は、(一時的なバッファが空であるため)次のport_DataReceivedのデータは1A-31で始まっていないことがわかっています。ただし、最後の部分(次の1A-31まで)をスキャンし、一時バッファ(前のport_DataReceivedコールに格納されているもの)を追加してStatementReceivedを上げ、一時バッファを消去します。

同様の方法で、3つ以上のデータチャンクを送信する必要があるステートメントも処理できます。 1A-31に遭遇しないたびに、ステートメントが完了するまで、受け取ったデータをテンポラリバッファに追加します。

最後に、起動時に読み込む最初のバイトが1A-31で始まらない場合は、それらを破棄するだけです。半分のステートメントで何かをすることはできません。

+0

大きな助け、ありがとう! –