2017-02-09 5 views
-1

シリアルポートからのデータ受信に問題があります。毎回12バイトが送信され、各バイトを読み込んで配列に入れ、リッチテキストボックスに表示したい(すべてのバイトが別々の行に表示されます)。しかし、問題があります。データが連続して送信されるとき、私は端末プログラムで受け取っていない、まったく関係のないいくつかの余分な0を取得します。 ここに私のコードがあります。あなたが私を助けることができたらうれしいです。Cで余分なシリアル受信データ#

private void data_received(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     richTextBox1.Invoke(new EventHandler(ReadFromPort)); 
    } 

    private void ReadFromPort(object sender, EventArgs e) 
    { 
     int bytes = 0; 
     label2.Text = ""; 
     bytes = serialPort1.BytesToRead; 
     label2.Text = bytes.ToString(); 
     byte[] buffer = new byte[12]; 

     for (int k = 0; k < bytes; k++) 
     { 
      buffer[k] = 0; 
     } 
     serialPort1.Read(buffer, 0, bytes); 
     for (int i = 0; i < buffer.Length ; i++) 
     { 
      richTextBox1.AppendText(buffer[i].ToString() + Environment.NewLine); 
     } 

}

+0

'new byte [bytes]'の代わりに 'buffer.Length'が' 12'に設定されています。また、 'new byte []'はゼロの配列を返します。値をゼロに設定する必要はありません。また、値を0に設定することは、次の行に上書きするため意味がありません。 – Groo

+0

serialPort1.Readは実際に読み取られたバイト数を返します。これは12未満である可能性があります。コードは常に12バイトを返すと仮定しています。 – Joe

+0

常に12バイトが送信されると確信しています。そして、ターミナルプログラムもそれを確認します。ここで問題となるのは、そこにいるはずのゼロが時々得られるからです。 – srt

答えて

0

あなたはNを読んでいるバッファにバイトが、関係なく、あなたがそれに読み込まれたバイト数のバッファ全体を表示します。時には12バイトを得ることはできませんが、それ以下のものはありません。しかし、あなたはまだ明らかに、すべての12

変更for (int i = 0; i < buffer.Length ; i++)

2

あなたread the documentationSerialPort.Readfor (int i = 0; i < bytes ; i++)に表示する:カウントは、入力バッファ内のバイト数よりも大きい場合

少ないバイトが読まれます。

戻り値は、ポートから実際に読み取られたデータの量を示します。次に、配列からこのバイト数だけを表示します。

int bytesRead = serialPort1.Read(buffer, 0, bytes); 
for (int i = 0; i < bytesRead; i++) 
{ … } 
関連する問題