【问题标题】:How to use SerialPort in .Net by using DataReceived event?如何使用 DataReceived 事件在 .Net 中使用 SerialPort?
【发布时间】:2010-04-23 03:18:39
【问题描述】:

我知道DataReceived event 是在后台线程上触发的。如何告诉 GUI 线程在事件处理程序中显示数据?

【问题讨论】:

    标签: .net winforms multithreading


    【解决方案1】:

    此代码假定您已经添加了一个表单级 SerialPort 对象,该对象将 port_DataReceived 方法附加到其 DataReceived 事件,并且您的表单上有一个名为 label1 的标签。

    我不能 100% 确定将端口中可用字节转换为字符串的代码,因为我没有使用实时串行端口收集数据来运行它。但是此代码将允许您显示接收到的数据,而不管事件是否在不同的线程上。

    void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort port = (SerialPort)sender;
        byte[] buffer = new byte[port.BytesToRead];
        port.Read(buffer, 0, buffer.Length);
        string data = UnicodeEncoding.ASCII.GetString(buffer);
        if (label1.InvokeRequired)
        {
            Invoke(new EventHandler(DisplayData), data, EventArgs.Empty);
        }
        else
        {
            DisplayData(data, EventArgs.Empty);
        }
    }
    
    private void DisplayData(object sender, EventArgs e)
    {
        string data = (string)sender;
        label1.Text = data;
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用表单上的IsInvokeRequired and BeginInvoke 方法将控制权切换回 UI 线程。

      在某些情况下,我还使用计时器来监视某些共享数据结构(例如消息列表)的变化。但是,当您从某个后台线程收到相当稳定的消息流时,这种方法效果最好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-08
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        相关资源
        最近更新 更多