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

时间:2013-07-10 12:25:24

标签: c# .net serial-port

我定义了一个串口(C#/ .Net),然后在收到数据时分配了 SerialDataReceivedEventHandler

myPort.DataReceived += new SerialDataReceivedEventHandler (myEventHandler);

但是,无论何时收到数据,我都需要做多件事,包括:

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

我应该从 myEventHandler 中运行所有这些功能;这是正确的做法吗?问题是,例如,当我尝试从 myEventHandler 中更改 RichTextBox 时,我收到一条错误,指出我正在进行跨线程操作。< / p>

更新

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

    StoreToSqlDatabase ();

    SerialWriteResponseMessage ();
}

1 个答案:

答案 0 :(得分:1)

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

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

SerialPort.DataReceived的文档说:

  

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

代码看起来像:

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