我正在尝试从 RS-232 端口读取数据。有谁有一个例子说明我如何从端口/缓冲区获取数据并确保我拥有所有数据,因为它可以是多行数据。
我只是简单地读如下吗?
string Rxstring = port.ReadLine();
Console.WriteLine(Rxstring);
问:如何从端口/缓冲区获取日期,或从连接的设备输入数据。并确保您拥有所有数据。
答:我广泛使用 .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 数据,您需要与设备建立握手。您必须让设备以设备满意的速度进行处理。在必须传输较大数据的情况下,请考虑设置一个简单的数据包传递协议和命令信号量构造 - 或使用控制器/设备设计使用的协议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)