以下是自动读取串口的非常简单的代码:-

public partial class MainForm : Form
    {
        public MainForm()
        {
        //
        // The InitializeComponent() call is required for Windows Forms designer support.
        //
        InitializeComponent();

        //
        // TODO: Add constructor code after the InitializeComponent() call.
        //


        serialPort1.PortName="COM11";
        serialPort1.Open();

    }
    void SerialPort1DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        rtBox.Text="Data Received\n";
    }
    void BtnReadClick(object sender, EventArgs e)
    {
        rtBox.Text += "Read click" + "\n";
    }


System.InvalidOperationException:跨执行绪作业无效:访问控制项'rtBox'时所使用的执行绪与建立控制项的执行绪不同。

Google的英文翻译是汉字翻译
“未完成的线程作业:用于访问控件'rtBox'的线程与建立控件的线程不同。”

我只想在Rich测试框中显示消息“数据接收”。但是,无论何时接收到数据,都会出现以下异常:

你知道为什么吗?谢谢

最佳答案

WinForm控件(例如,您的富文本框)只能从主UI线程访问。您的串行端口对象正在从另一端口调用事件处理程序。

您可以更改处理程序以执行以下操作-

void SerialPort1DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    Invoke(new Action(() =>
    {
        rtBox.Text="Data Received\n";
    }));
}


这将使用Control.Invoke,然后将在UI线程中运行内部代码。

关于c# - 在C#中自动读取串口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43939358/

10-14 22:07