2009-09-04 115 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 2009-09-04 13:34:11

+0

這是一個流,所以你可以調用'Flush()'。但我不認爲你需要它。詳情在這裏:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting.aspx – 2009-09-04 14:29:26

+0

這是非常棒的,感謝您的幫助! – George 2009-09-04 15:42:40

2

問:如何從端口/緩衝區獲取日期,或從連接的設備輸入數據。並確保你有所有的數據。

答:我已經廣泛使用.net串行端口類驅動程序,我的任務是創建可靠的,可靠的代碼。這意味着被測連接設備必須運行並且不會在長時間內失效。串口可以和確實會丟失數據!不要忘記這一點。

//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數據你需要設置與設備握手。您必須讓設備按照設備滿意的速度進行處理。在需要傳輸更大數據的情況下,可以考慮設置一個簡單的數據包傳遞協議和命令信號結構 - 或者使用控制器/設備設計用於定義的協議。