串口数据接收事件处理程序

Posted

技术标签:

【中文标题】串口数据接收事件处理程序【英文标题】:Serial Port Data Received Event Handler 【发布时间】:2014-11-13 21:49:44 【问题描述】:

我正在从 C# 中的串行端口读取数据,如下所示:

mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

如果函数 DataReceivedHandler 是计算密集型的,有没有办法确保在接收到下一个数据时它不会等待前一个函数完成,而是使用新数据启动另一个 DataReceivedHandler 实例?

【问题讨论】:

【参考方案1】:

嗯,我不认为来自 Gh0st22 的回答同时是正确的。首先,DataReceivedHandler 已经从串行端口类内部的线程池中调用。其次,我没有看到任何实现或提及的锁定。处理串行缓冲区将是一场噩梦,所以让我们退后一步。

你真的在观察你害怕会发生的问题吗?看到我多次引用的这个伟大的回应:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e36193cd-a708-42b3-86b7-adff82b19e5e/how-does-serialport-handle-datareceived?forum=netfxbcl#298028ff-2b76-4685-947c-f68291882b09

如果您绝对必须启动另一个线程,请考虑读取可用的串行数据并将其作为参数传递。否则,您只会给自己和该项目的任何未来维护者造成巨大的混乱。

【讨论】:

【参考方案2】:

您可以通过使用Threading(添加using System.Threading;)来实现此目的

public static void main(string[] args)

    SerialPort mySerialPort = new SerialPort();
    mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);


public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)

    Thread thread = new Thread(thisClass.Worker);
    thread.Start(sender, e);


public static void Worker(object sender, object ev)

    SerialDataReceivedEventArgs e = (SerialDataReceivedEventArgs) ev;
    // Put your code here

优势

在工作完成时调用此方法时,将允许完成

缺点

程序将继续运行,即使在关闭之后,直到所有线程都完成

【讨论】:

根据 MSDN 页面,DataReceived 事件已经从一个单独的线程中触发。启动另一个线程是不必要的,因为它已经另一个线程。

以上是关于串口数据接收事件处理程序的主要内容,如果未能解决你的问题,请参考以下文章

ALB学习笔记基于事件触发方式的串行通信接口数据接收案例

c# 定时器调用控件的事件处理事情出现卡死主界面如何解决

是否可以向 ZeroMQ 添加事件处理以在接收/发送数据时采取行动?

串口通信属性及事件解析

js事件流事件处理程序/事件侦听器

事件处理程序