serialPort的"DataReceived" 事件里为何不能访问窗体上的控件!
我是新来的朋友,很高兴在这里认识大家!下面我想问大家一个问题:我在VS2005的窗体上有一个"serialPort控件",为什么不能在DataReceived" 事件里访问窗体上的控件? 出现如下错误:
System InvalidOperationException:线程间操作无效:从不是创建控件"textCardnum"的线程访问它。
有知道的朋友烦请告知,多谢了! --------------------编程问答-------------------- CheckForIllegalCrossThreadCalls = false; --------------------编程问答-------------------- 恩 不捕获错误线程的调用。 学习 --------------------编程问答-------------------- 我的dataarive事件根本就不能触发,你代码发出来看看啊. --------------------编程问答-------------------- 多线程访问UI会出错。
你必须用委托来完成 --------------------编程问答-------------------- 我的也是,DATARECEIVE事件不能触发,有人有例子吗?发来学习下,可以吗? --------------------编程问答-------------------- SerialPort类读取数据的许多方法是同步阻塞调用,尽量避免在主线程中调用,可以使用异步处理或线程间处理调用这些读取数据的方法。
由于DataReceived事件在辅线程被引发,当收到完整的一条数据,返回主线程处理或在窗体上显示时,请注意跨线程的处理,C#可采用控件异步委托的方法Control.BeginInvoke及同步委托的方法Invoke。
--------------------编程问答-------------------- 不能出发的,看一下你的SerialPort的Dts属性和Rts属性,都应该设为True才行 --------------------编程问答-------------------- 我也遇到这个问题 求解. --------------------编程问答-------------------- 用委托 或者多线程 --------------------编程问答-------------------- 2007年的帖子 我擦 好古老 收到数据以后 更新textbox 用个委托就好了 --------------------编程问答-------------------- 发一个例子,已经调试通过。
Public Class Form1
Private Delegate Sub QR_Read(ByVal iContent As String)
Private pmReadStop As Boolean = False
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConnectPort.Click
Dim plSettings() As String
plSettings = TextBox2.Text.Split(",")
SerialPort1.PortName = TextBox1.Text
With SerialPort1
.BaudRate = plSettings(0) '/ ボーレート設定
'
Select Case plSettings(1) '/ パリティ設定
Case "E"
.Parity = IO.Ports.Parity.Even
Case "N"
.Parity = IO.Ports.Parity.None
Case "O"
.Parity = IO.Ports.Parity.Odd
Case "S"
.Parity = IO.Ports.Parity.Space
Case "M"
.Parity = IO.Ports.Parity.Mark
End Select
'
.DataBits = plSettings(2) '/ データビット設定 '
.StopBits = plSettings(3) '/ ストップビット設定
''
If .IsOpen Then
.Close()
End If
.Open()
End With
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ClosePort.Click
With SerialPort1
If .IsOpen Then
.Close()
End If
End With
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sender.Click
With SerialPort1
.WriteLine(TextBox3.Text)
End With
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Dim plReadString As String
If pmReadStop Then
pmReadStop = False
Return
End If
Threading.Thread.Sleep(300)
plReadString = SerialPort1.ReadExisting
'TextBox4.Text = plReadString
Dim plInvokeFunc As New QR_Read(AddressOf Me.QRRead)
Me.Invoke(plInvokeFunc, plReadString)
End Sub
Private Sub QRRead(ByVal ReceivedString As String)
TextBox4.Text = ReceivedString
End Sub
End Class
--------------------编程问答--------------------
大哥,VB写的呀!神奇! --------------------编程问答-------------------- 哇噻,这帖子居然5年了还没解决啊?
补充:.NET技术 , C#