[英]C# - readin from serial port buffer
我正在嘗試從RS-232端口讀取數據。 有沒有人舉過一個例子,說明如何從端口/緩沖區獲取數據,並確保我擁有所有數據,因為它可以是多行數據。
我是否簡單閱讀如下?
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數據,則需要與設備建立握手。 您必須讓設備以設備滿意的速度處理。 在必須傳輸較大數據的情況下,請考慮建立一個簡單的數據包通過協議和命令信號量結構-或使用所定義的控制器/設備可以使用的協議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.