2016-04-12 14 views
0

シリアルポートからデータを読み込んでいますが、シリアルポートからのデータがチャンクされています。 SOH(\ u0001バイト)とEOT(\ u0004)で終わる場合、私はSOHバイトでメッセージを分割しようとしましたが、それでも問題はあります。 これを行うにはよりエレガントで安全な方法がありますか?C#シリアルポートデータフォーマット受信データ

private void RecebendoDados(object sender, SerialDataReceivedEventArgs e) 
{ 
    try 
    { 
     var id_prova = Form1._Form1.IDPROVA; 
     var serie = Form1._Form1.SERIE; 
     var fase = Form1._Form1.FASE; 

     var http = new ComunicacaoWeb(); 
     var sp = (SerialPort)sender; 
     var indata = sp.ReadExisting(); 
     Console.WriteLine(indata+"\n\r"); 

     if (!sp.IsOpen) { 
      sp.Open(); 
     } 

     var pacotes = indata.Split(new[] { "\u0004" }, StringSplitOptions.None); 

答えて

0

これを行うために、よりエレガントかつ安全な方法をTheresの?

EOTの制御コードを使用してメッセージの終わりなら、SerialPortは、この文字の最初の出現まで正確に読み取ることができます。

SerialPort sp = (SerialPort)sender; 
// this lines converts the hex-code of EOT to a char and read the incoming 
// message only up to this point 
string indata = sp.ReadTo(Convert.ToChar(0x04)); 

は今、あなたはSOTを取り除くためにだけ必要があります。この時点で

indata = indata.TrimStart(Convert.ToChar(0x01)); 

あなたはクリーンなメッセージである必要があります。

プロパティBytesToReadはまだバッファにデータがあるかどうかを教えてくれます:

int stillToBeRead = sp.BytesToRead; 

あなたはそれを確認し、必要に応じて読み取り手順を繰り返すことができます。

2.

は、これを行うために、よりellegantと安全方法Theresの?

閉じたポートから読み取ろうとすると、System.InvalidOperationExceptionで失敗します。このロジックによって、コード内のif条件が入力されてポートを再び開くことはありません。

var sp = (SerialPort)sender; 
var indata = sp.ReadExisting(); 

if (!sp.IsOpen) { 
    // this will never be executed 
    sp.Open(); 
} 

あなたは、ポートが開いており、そこから読み取ろうとする前に読むべきデータがあるかどうかを確認する必要があります。私はRecebendoDadosDataReceivedイベントだと思うので、閉じたポートを持ち、読み込むデータがない確率は低いですが、悪魔は細かいところで眠ります;