繁体   English   中英

串行C#中的datareceived事件处理程序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM