2016-10-18 18 views
0

SerialPortを使用して接続するために必要なデバイスがあります。 このデバイスは私の側からコマンドを受け取り、私にデータを送信します。 同じクラスですべての送受信を行っています=>同じスレッドです。同時にシリアルポートに書き込んで読み込む方法は?

私はこのデバイスに接続されており、このデバイスとの間でコマンドとデータの送受信に成功しています。

25ミリ秒ごとに送信する必要があるコマンドの1つは、「あなたのステータスを教えてください」ということです。つまり、デバイスにデータがある構造体を送り返すように要求します。

いくつかの受信データが欠落している場合... 'serialPortStream.BytesToRead'(取得するデータがあるかどうかをテストしています)を実行すると、私はまだ私がRadしていない古いバッファを読み込みます。 最後のパッケージを読んだり、新しいデータを受け取ったりすると、以前に受け取った古いデータが削除されることがあります。

+0

2つのスレッドが必要です。新しいバイトが受信されるたびに、ConcurrentQueueに値を設定するイベントハンドラ(例:SerialPort.DataRecieved + = ____)を持つクラスを作成します。あなたはメインスレッドのこのキューから読み込み、そこからあなたの書き込みを行うことができます。あなたのパケットは故障している可能性がありますが、間違いなく間違いはありません。 – rolls

答えて

2

データをConcurrentQueueなどに保存するOnRecieveDataハンドラを使用します。

namespace Test 
{ class Program 
    { 
     const int bufSize = 2048; 
     static void Main(string[] args) 
     { 

      Byte[] buf = new Byte[bufSize]; 
      SerialPort sp = new SerialPort("COM1", 115200); 
      sp.DataReceived += port_OnReceiveData; // Add DataReceived Event Handler 

      sp.Open(); 

      // Wait for data or user input to continue. 
      Console.ReadLine(); 


      sp.Close(); 
     } 

     private static void port_OnReceiveData(object sender, SerialDataReceivedEventArgs e) 
     { 
      SerialPort port = (SerialPort) sender; 
      switch(e.EventType) 
      { 
       case SerialData.Chars: 
       { 
        Byte[] buf = new Byte[bufSize]; 
        port.Read(buf, 0, bufSize) 
        Console.WriteLine("Recieved data! " + buf.ToString()); 
        break; 
       } 
       case SerialData.Eof: 
       { 
        // means receiving ended 
        break; 
       } 
      } 
     } 
    } 
} 
関連する問題