2009-09-04 26 views
3

RS-232ポートからデータを読み取ろうとしています。誰も私がどのようにポート/バッファからデータを取得し、それが複数行のデータになることができるようにすべてのデータを持っているかの例を持っていますか?C# - シリアルポートバッファからの読み取り

私は次のように読みますか?

string Rxstring = port.ReadLine(); 
Console.WriteLine(Rxstring); 

答えて

4

これを試してみてください:

using System.IO.Ports; 
... 

private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One); 

Console.WriteLine(port.ReadExisting()); 

詳細はCoad's Codeで見つけることができます。

+0

これもバッファにあるものを明確にするか、手動で行う必要がありますか? – George

+0

これはストリームなので、 'Flush()'を呼び出すことができます。しかし、私はあなたがそれを必要とは思わない。詳細はこちら:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting.aspx –

+0

これはあなたの助けを嬉しく思っています! – George

2

Q:ポート/バッファから日付を取得する方法、または接続されたデバイスからデータを入力する方法。あなたがすべてのデータを持っていることを確認してください。

A:私は、信頼性の高い堅牢なコードを作成するための.netシリアルポートクラスドライバを使用しています。これは、接続されている被試験デバイスが実行され、長時間にわたってフェイルしないことを意味します。シリアルポートはANDでデータを失う可能性があります。それを忘れないでください。

//from top of the head; 

using System.Port.IO; 
using System.Port; 

private class mywindowsForm: Form 
{ 
     StringBuilder sbReceived = new StringBuilder(); 
     string Received = string.Empty; 
     int byteCOUNT = 0; 

     System.Windows.Timers.Timer serialTimer; 

     //Default constructor 
     myWindowsForm() 
     { 
     //assume that you clicked and dragged serial port in 
      serialPort1 = new SerialPort();//create new serial port instance 
      serialPort1.Baud = 9600; 
      serialPort1.DataReceived+=<Tab><Enter> 
      //serial port timer 
      serialTimer = new System.Windows.Timers.Timer(500);//set to 500ms time delay 
      serialTimer.Elapsed+=<TAB><ENTER> 
     } 

     void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
     { 
      //serial port has detected input data 
      //however, we only want to get serial data so, 
      if(e.EventType !=SerialData.Chars) return; 
      //good design practice dictates that we have an event handler that we invoke 
      this.BeginInvoke(new eventhandler(AddReceive));//beginInvoke is designed to deal with asynchronous processes like serial port data. 
     } 

     private void AddReceive(object s, EventArg e) 
     { 
      byteCOUNT=serialPort1.BytesToRead;//count the number of bytes in RX buffer 
      if(byteCOUNT > 0) 
      { 
       string ST = serialPort1.ReadTo("\n");//lets get one line at a time 
       sbReceived.Append(ST);//add whatever has been RX'd to our container. 
       serialPort1.Interval =100; 
       serialPort1.Start();//to be sure we have all data, check to see for stragglers. 
       } 
     } 

     void serialTimer(object Sender, TimerElapsedEventArgs e) 
     { 
      serialTimer.Stop(); 
      this.BeginInvoke(new EventHandler(ReadData)); 
     } 

     void ReadData(object Sender, EventArgs e) 
     { 
      //parse output for required data and output to terminal display (build one using rich text box) 
      Received = sbReceived.ToString(); 
      //and if we have ANY MORE incoming data left over in serial buffer 
       if(Received.Length > 0) 
       { 
        //your data 
       } 
     } 
} 

これは十分なはずです。これは、C#でカスタマイズされた端末エミュレータを何年も作成した結果です。あなたがデバイスとのハンドシェイクを設定するために必要な大量のI/Oデータを持っている場合は特に、実行できる他のことがあります。デバイスが満足できる速度でデバイスを処理させる必要があります。より大きなデータを転送する必要がある場合は、単純なパケットパッシングプロトコルとコマンドセマフォの構成を設定するか、コントローラ/デバイスが動作するように設計されたプロトコルを使用することを検討してください。

関連する問題