如何使用DataReceived事件在.Net中使用SerialPort?

时间:2010-04-23 03:18:39

标签: .net winforms multithreading

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

2 个答案:

答案 0 :(得分:1)

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

在某些情况下,我还使用计时器来监视某些共享数据结构中的更改,例如消息列表。但是当你从一些后台线程获得非常稳定的消息流时,这种方法效果最好。

答案 1 :(得分: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;
}