接收到串行端口数据时如何处理多个操作

本文关键字:处理 操作 何处理 串行端口 数据 | 更新日期: 2023-09-27 18:21:59

我定义了一个串行端口(C#/.Net),然后为接收到的数据分配了一个串行数据接收事件处理程序

myPort.DataReceived += new SerialDataReceivedEventHandler (myEventHandler);

然而,每当收到数据时,我都需要做很多事情,包括:

  • 将数据保存到我的SQL数据库中
  • 在UI上更新RichTextBox
  • 发回响应串行消息

我应该从myEventHandler中运行所有这些函数吗;这是正确的做法吗?问题是,例如,当我试图从myEventHandler中更改RichTextBox时,我会收到一个错误,说明我正在进行跨线程操作。

更新:

private void myEventHandler (object sender, SerialDataReceivedEventArgs e)
{
    Action myAction = () => rtbMyRichTextBox.Text = InputMessageString;
    if (rtbMyRichTextBox.InvokeRequired)
        rtbMyRichTextBox.Invoke(myAction);
    else
        myAction();
    StoreToSqlDatabase ();
    SerialWriteResponseMessage ();
}

接收到串行端口数据时如何处理多个操作

您应该在该事件处理程序中或在它调用的方法中执行所有这些操作。

您可以通过与UI线程同步来解决跨线程问题。如果这是Windows窗体应用程序,则需要使用InvokeRequired和Invoke。这些文档链接有很好的例子。

SerialPort.DataReceived的文档显示:

从SerialPort对象接收数据时,在辅助线程上引发DataReceived事件。由于此事件是在辅助线程而非主线程上引发的,因此尝试修改主线程中的某些元素(如UI元素)可能会引发线程异常。如果有必要修改主Form或Control中的元素,请使用Invoke将更改请求发回,Invoke将在正确的线程上完成工作。

代码看起来像:

void myEventHandler(object sender, SerialDataReceivedEventArgs e)
{
    DoSqlUpdate();
    this.Invoke(UpdateUI, data);  // pass whatever data that needs to be updated
    SendResponseMessage();
}