当前位置:编程学习 > C#/ASP.NET >>

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


--------------------编程问答--------------------
引用 11 楼  的回复:
发一个例子,已经调试通过。

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.Ob……

大哥,VB写的呀!神奇! --------------------编程问答-------------------- 哇噻,这帖子居然5年了还没解决啊?
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,