[英]datareceived Event Handler in Serial C#
我正在尝试实现基于数据接收的事件处理程序,我想我能够从端口接收数据,但是执行事件时遇到了困难。.我已经尝试了ReadLine和ReadExisting ..请您对我的代码发表评论。.谢谢,
private void Form1_Load( object sender, EventArgs e )
{
// graphing stuff
portname = "COM1";
parity = Parity.None;
BaudRate = 115200;
stopbits = StopBits.One;
databits = 8;
port = new System.IO.Ports.SerialPort(portname);
port.Parity = parity;
port.BaudRate = BaudRate;
port.StopBits = stopbits;
port.DataBits = databits;
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
count = 0;
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
line = port.ReadLine();
count++;
this.BeginInvoke(new LineReceivedEvent(LineReceived),line);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private delegate void LineReceivedEvent(string text);
private void LineReceived(string text)
{
if (zedGraphControl1.GraphPane.CurveList.Count <= 0)
return;
LineItem curve = zedGraphControl1.GraphPane.CurveList[0] as LineItem;
if (curve == null)
return;
IPointListEdit list = curve.Points as IPointListEdit;
double value = double.Parse(text);
list.Add(count, value);
// graphing stuff
}
// graphing stuff
}
我在串行通信方面做了很多工作,而DataReceived
从未像我想要的那样工作。 SerialPort
上有一个名为ReceivedBytesThreshold
的属性,该属性在事件触发时应该会更改,但是我碰运气了。 对该事件进行一些谷歌搜索,您将获得成千上万个报告此问题的结果。 该事件有时可以工作,但我不会依靠它进行关键任务操作。
如果您正在寻找行尾,我发现这样做的更好方法是简单地执行一个紧密循环,如果有可用字节,则将其连续读取到缓冲区中,然后在遇到行时在缓冲区上调用LineReceived
方法结尾。 将其放在自己的线程上,它应该可以解决问题。 在循环内添加一些Thread.Sleep()
,以防止其接管。
如果您不希望对串行流产生瞬时反应,则每秒钟或半秒在线程计时器上运行它。 计时器的每个滴答声,都将所有现有字节读入缓冲区,并且每当遇到一行结尾时,调用LineReceived
。
我还使用DataReceived事件在我们的一种产品中取得了巨大的成功。 我正在执行的协议要求6个字节的最小数据包大小,因此我将其用作接收阈值。
我确保保留所有孤立数据,如果读取不完整或数据包格式错误,则在下次事件发生时进行重构。 我确实很少遇到这种实现问题。 我建议锁定事件处理程序,这样您就不会在串行端口上引起竞争,但是可能不需要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.