我想使用 UART 将温度值从微控制器发送到 C# 接口并显示温度Label.Content。这是我的微控制器代码:
Label.Content
while(1) { key_scan(); // get value of temp if (Usart_Data_Ready()) { while(temperature[i]!=0) { if(temperature[i]!=' ') { Usart_Write(temperature[i]); Delay_ms(1000); } i = i + 1; } i =0; Delay_ms(2000); } }
我的 C# 代码是:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); textBox1.Text = txt.ToString(); }
但出现异常“ 跨线程操作无效:控制’textBox1’从创建它的线程以外的线程访问 ”请告诉我如何从我的微控制器获取温度字符串并删除此错误!
在您的serialPort1_DataReceived方法中接收到的数据来自另一个线程上下文而不是 UI 线程,这就是您看到此错误的原因。 要解决此问题,您必须使用 MSDN 文章中所述的调度程序: 如何:对 Windows 窗体控件进行线程安全调用
serialPort1_DataReceived
因此,不要直接在serialport1_DataReceived方法中设置 text 属性,而是使用以下模式:
serialport1_DataReceived
delegate void SetTextCallback(string text); private void SetText(string text) { // InvokeRequired required compares the thread ID of the // calling thread to the thread ID of the creating thread. // If these threads are different, it returns true. if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }
所以在你的情况下:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting().ToString(); SetText(txt.ToString()); }