[C#] SerialPort クラスによる、仮想 COM ポート アクセス

SerialPort クラスを使って、USB や Bluetooth で PC に接続され、仮想 COM ポートにマップされた周辺デバイスとの通信方法を解説します。

 
 
 
 
 
(0)
Add to favorites
5/10/2011
E-mail Twitter del.icio.us Digg Facebook
Sign in to ask a question


  • DataRecivedをイベントハンドラに登録する理由を教えてください。
    3 Posts | Last post December 04, 2014
    • スレッドとイベントの関係がよくわかっていないので、質問させてください。
      
      すべての受信バイトを読み取った後の以下のコードにはどういう意味があるのですか?
      if (rbyte > 0) 
      { 
          DataReceived(buffer); 
      } 
    • ReceiveData()メソッド内での、do {...} while(...); ループでSerialPortからデータを受信しています。具体的にはmyPort.Read()で受信しているわけですが、このコールでは、bufferというbyte配列に受信したデータを書き込んでいます。
      DataReceived(buffer)は、受信したデータを、SerialPortProcessorを利用している側に通知するためにコールしています。
      SerialPortProcessorクラスを利用する側のサンプルを示すとわかりやすいと思うので、以下に紹介します。
      
      void Foo()
      {
          var spp = new SerialPortProcessor();
          ...
          spp.DataRecieved += DataReceivedCallback;
          spp.Start();
      }
      
      void DataReceivedCallback(byte[] data)
      {
          for (int i=0;i<data.Length;i++)
          {
              var d = data[i];
          }
      }
      
      こんな風に、DataReceivedCallback()メソッドを、SerialPortProcessorのDataReceivedイベントに+=しておくと、SerialPortProcessorクラス内でSerialPortにデータが受信されるたびに、DataReceivedCallback()メソッドがコールされ、受信したデータがSerialPortProcessorクラスの利用側に渡されます。SerialPortのReceive()メソッドはコールされると、データが受信されるまで制御がブロックされてしまいます。ブロックされてしまうと他に必要な制御が続けられません。解決策はマルチスレッド化して制御の流れを二つにすることであり、その役割をSerialPortProcessorクラスが担っているわけです。
      利用側は、必要な処理を継続し、DataReceivedCallback()が呼ばれたら、受信用の処理をするというすっきりとした実装が可能になります。
      
      
      
    • Callbackで使うということで、完全に理解できました。
      具体的なサンプルまでありがとうございました。