.NET串行端口DataReceived(开/关)

时间:2011-08-20 00:22:29

标签: .net serial-port

我正在使用.NET 4串行端口类和DataReceived处理程序。

在DataReceive处理程序中,我从串口删除处理程序,处理数据,并在函数末尾重新添加处理程序。

try
{
  serial_port.datareceived -= new serialdatareceivedeventhandler(ondatareceived);

  // readline and process data
}
catch (exception ex)
{
}
finally
{
  serial_port.datareceived += new serialdatareceivedeventhandler(ondatareceived);
}

这种用法有什么后果?虽然我没有长期测试,但似乎工作得很好。我应该研究一种不同的方法吗?如果可能,请提供简单的代码示例/大纲。谢谢。

3 个答案:

答案 0 :(得分:0)

我个人不会删除每个DataReceived事件的处理程序,它是不必要的。如果您没有收到传入数据的通知,则总是有可能超出现有缓冲区并丢失信息。

我会使用与Microsoft Example类似的东西:

从上面的MSDN文章:

 private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
 {
    SerialPort sp = (SerialPort)sender;
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
  }

答案 1 :(得分:0)

如果您担心可重入,请使用lock或互斥:

lock(lockobj)
{
    /*Read data from the port here.*/
}

取消订阅该事件并不能成功阻止重入,因为由于抢占式调度(与合作多线程或类似的东西相反),您的代码可能在进入方法之后(甚至在之前)被抢占之前你有机会取消订阅,更多的数据到达,再次触发机制。

实际上,文档明确说明,

  

Only one event handler can execute at a time.

答案 2 :(得分:-2)

关于此代码:

catch (exception ex)
{
}

永远,永远,永远,永远,永远,永远,永远,永远不会写出这样的代码。

就像拆掉孩子卧室里的烟雾探测器一样。