我試圖從RS-232端口讀取數據。有沒有人有我如何從端口/緩衝區獲取數據的例子,並確保我擁有所有的數據,因爲它可以是多行數據。C# - 從串口緩衝區讀入
我是否簡單閱讀如下?
string Rxstring = port.ReadLine();
Console.WriteLine(Rxstring);
我試圖從RS-232端口讀取數據。有沒有人有我如何從端口/緩衝區獲取數據的例子,並確保我擁有所有的數據,因爲它可以是多行數據。C# - 從串口緩衝區讀入
我是否簡單閱讀如下?
string Rxstring = port.ReadLine();
Console.WriteLine(Rxstring);
試試這個:
using System.IO.Ports;
...
private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
Console.WriteLine(port.ReadExisting());
詳情可Coad's Code找到。
問:如何從端口/緩衝區獲取日期,或從連接的設備輸入數據。並確保你有所有的數據。
答:我已經廣泛使用.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數據你需要設置與設備握手。您必須讓設備按照設備滿意的速度進行處理。在需要傳輸更大數據的情況下,可以考慮設置一個簡單的數據包傳遞協議和命令信號結構 - 或者使用控制器/設備設計用於定義的協議。
這是否也清除了緩衝區中的內容,或者我必須手動執行該操作? – George 2009-09-04 13:34:11
這是一個流,所以你可以調用'Flush()'。但我不認爲你需要它。詳情在這裏:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting.aspx – 2009-09-04 14:29:26
這是非常棒的,感謝您的幫助! – George 2009-09-04 15:42:40