C# 串行C中的datareceived事件处理程序#
我正在尝试实现基于DataReceived的事件处理程序,我认为我能够从端口接收数据,但在执行事件时遇到困难。。我尝试了ReadLine和ReadExisting。。你能评论一下我的代码吗。。谢谢C# 串行C中的datareceived事件处理程序#,c#,C#,我正在尝试实现基于DataReceived的事件处理程序,我认为我能够从端口接收数据,但在执行事件时遇到困难。。我尝试了ReadLine和ReadExisting。。你能评论一下我的代码吗。。谢谢 private void Form1_Load( object sender, EventArgs e ) { // graphing stuff portname = "COM1"; parity = Par
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
}
private void Form1\u加载(对象发送方,事件参数e)
{
//绘图材料
portname=“COM1”;
奇偶=奇偶。无;
波特率=115200;
停止位=停止位。1;
数据位=8;
端口=新系统.IO.Ports.SerialPort(端口名);
端口奇偶性=奇偶性;
port.BaudRate=波特率;
port.StopBits=停止位;
port.DataBits=DataBits;
port.DataReceived+=新的SerialDataReceiveDevenHandler(port_DataReceived);
port.Open();
计数=0;
}
无效端口\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
尝试
{
line=port.ReadLine();
计数++;
此.BeginInvoke(新LineReceivedEvent(LineReceived),行);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私有委托void LineReceivedEvent(字符串文本);
已接收专用无效行(字符串文本)
{
如果(zedGraphControl1.GraphPane.CurveList.Count我在串行通信方面做了很多工作,接收的数据从来没有像我希望的那样工作。SerialPort
上有一个名为ReceivedBytestThreshold
的属性,该属性应该在事件触发时更改,但我遇到了运气不佳的情况。试试看吧盯着这个事件看,你会发现成千上万的结果报告问题。这个事件有时可以工作,但我不会依赖它来执行关键任务
如果你在寻找行尾,我发现更好的方法是简单地使用一个紧密的循环,如果字节可用,它会不断地将字节读入缓冲区,然后在遇到行尾时调用缓冲区上的LineReceived
方法。将它放在自己的线程上,它应该可以做到这一点。添加一些Thread.Sleep()
在循环内部,以防止其接管
如果你不是在寻找对串行流的即时反应,那么每隔一秒或半秒在线程计时器上运行一次。计时器的每一次滴答声,将所有现有字节读入缓冲区,并且每当你遇到行尾调用时,调用LineReceivedLineReceived我也在on中非常成功地使用了DataReceived事件我正在实施的协议要求最小数据包大小为6字节,因此我使用这是我的接收阈值
我确保保留所有孤立数据,并在下次事件发生时,如果我得到不完整的读取或格式错误的数据包,将其重建。我确实对此实现没有什么问题。我建议锁定事件处理程序,这样就不会在串行端口上出现争用,但这可能不是必需的。什么问题d你收到数据了吗?它对我来说很好(我想我收到的是Bytes Threshold=1)有时候,我一点问题都没有。其他时候,它只是在应该的时候拒绝发射。当数据非常断断续续(而且波特率很慢)时,我的运气会更好。我认为这与事件处理程序在下一组数据进入之前未退出有关。但是,我发现以手动方式执行该操作平均会产生更好的结果。好的。。我刚刚修复了几个问题,它似乎正常工作,但没有如预期的那样。。(我对委托的声明是在我调用它之后进行的!)有些数据没有被识别为double by double.Parse,但我在另一端特别注意,正在发送的数据是带有换行符的double!无论如何,我确实使用了float.tryparse,而且它似乎正在工作,因此可以松一口气,但是,我知道我并没有得到所有数据。如果这样做,这项工作将有点关键考虑drharris提出的建议。保持波特率低。你一次调用一个数字,这是很多调用可以导致UI线程停止绘画。你的用户只能看到每秒大约20次更新,然后变成模糊。缓冲区来解决问题。