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

C# 串行C中的datareceived事件处理程序#,c#,C#,我正在尝试实现基于DataReceived的事件处理程序,我认为我能够从端口接收数据,但在执行事件时遇到困难。。我尝试了ReadLine和ReadExisting。。你能评论一下我的代码吗。。谢谢 private void Form1_Load( object sender, EventArgs e ) { // graphing stuff portname = "COM1"; parity = Par

我正在尝试实现基于DataReceived的事件处理程序,我认为我能够从端口接收数据,但在执行事件时遇到困难。。我尝试了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   
}
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()
在循环内部,以防止其接管


如果你不是在寻找对串行流的即时反应,那么每隔一秒或半秒在线程计时器上运行一次。计时器的每一次滴答声,将所有现有字节读入缓冲区,并且每当你遇到行尾调用时,调用LineReceived
LineReceived

我也在on中非常成功地使用了DataReceived事件我正在实施的协议要求最小数据包大小为6字节,因此我使用这是我的接收阈值


我确保保留所有孤立数据,并在下次事件发生时,如果我得到不完整的读取或格式错误的数据包,将其重建。我确实对此实现没有什么问题。我建议锁定事件处理程序,这样就不会在串行端口上出现争用,但这可能不是必需的。

什么问题d你收到数据了吗?它对我来说很好(我想我收到的是Bytes Threshold=1)有时候,我一点问题都没有。其他时候,它只是在应该的时候拒绝发射。当数据非常断断续续(而且波特率很慢)时,我的运气会更好。我认为这与事件处理程序在下一组数据进入之前未退出有关。但是,我发现以手动方式执行该操作平均会产生更好的结果。好的。。我刚刚修复了几个问题,它似乎正常工作,但没有如预期的那样。。(我对委托的声明是在我调用它之后进行的!)有些数据没有被识别为double by double.Parse,但我在另一端特别注意,正在发送的数据是带有换行符的double!无论如何,我确实使用了float.tryparse,而且它似乎正在工作,因此可以松一口气,但是,我知道我并没有得到所有数据。如果这样做,这项工作将有点关键考虑drharris提出的建议。保持波特率低。你一次调用一个数字,这是很多调用可以导致UI线程停止绘画。你的用户只能看到每秒大约20次更新,然后变成模糊。缓冲区来解决问题。