2016-08-01 3 views
0

シリアルデバイスからストリーミングされたデータがあります。私はデータパケットが常にF4で始まる16進文字列としてこれを持っています。データストリームをパケットに分割する方法は?

while (_serialPort.BytesToRead > 0) 
     { 
      var chunk = new byte[_serialPort.BytesToRead]; 
      _serialPort.Read(chunk, 0, chunk.Length); 

      _text += BitConverter.ToString(chunk); 
     } 

をそして、それはBytesToReadあるとして、チャンク変数は常に異なっている:

私が使用しています。パケットが入ってくると、パケットをどのように分割すべきですか?

私は考えています:

文字列がF4が含まれている場合は、 バッファにデータをプッシュを開始します。 次のF4で、既存のバッファを停止して処理し、再度入力を開始します。

これは実行可能なアプローチですか? これにはどのような方法が最適ですか?

+0

*「16進文字列」*とはどういう意味ですか?この 'F4'は0xF4のバイト値か二つのASCII文字「F4」か???メッセージのデータ部分にこの開始バイト/シーケンスも含めることができる場合、この1つのテストのみに依存することは、メッセージフレームを誤認する傾向があります。少なくともチェックサム(またはより良いCRC32)や終了バイト/シーケンスの検出など、何らかのメッセージ完全性検証でメッセージの整合性を検証する必要もあります。いくつかの基本的な概念については、http://stackoverflow.com/questions/16177947/identification-of-packets-in-a-byte-stream/16180135#16180135を参照してください。 – sawdust

答えて

0

標準の練習は、あなたが正しいサイズに[]チャンクを設定した後、あなたは良いことがあります今、あなたのパケットがされている場合は、固定長バッファ

//you should re-use the buffer 
var chunk = new byte[8]; //this should be the actual packet size sent by the device  

int bytesRead; 
while ((bytesRead = _serialPort.Read(chunk, 0, chunk.Length)) > 0) 
{ 
    _text += BitConverter.ToString(chunk, 0, bytesRead); 
} 

をリサイクルすることです。そうでない場合は、StringBuilderを使用してテキストとしてバッファリングし、通常の文字列解析手法を使用します。

+0

こんにちは、ご返信ありがとうございます。私はパケットサイズが50だと思います。パケットが 'F4'で始まるようにするにはどうすればいいですか? – anti

+0

@anti - パケットがF4で始まり、パケットサイズが50であることが保証されていれば、もしあなたが運が良ければ、チャンクサイズを50に設定するとF4からすべて始まる可能性があります。可変長であれば、何らかのテキストバッファリングが必要です。その答えがもう少しうまくいくようにしたいのですが、私に教えてください。ありがとう! – hoodaticus

+0

デバイスは接続時にすでにストリーミング中ですので、悲しいことに開始点は完全に任意です。最後のバイトは実際にはチェックサムですが、パケットサイズをチェックするためにどのように使用するかについての情報は見つかりません! – anti

関連する問題