Serialport:更改DatareceivedHandler

时间:2010-11-29 18:25:41

标签: vb.net serial-port

打开端口时,我添加了处理程序,它可以正常工作 我需要的是,在某种程度上,将处理程序更改为另一个子程序。
我做的是:

AddHandler serport.DataReceived, AddressOf handler1

第一个处理程序按预期工作...
在代码中我做了一段时间后:

RemoveHandler serport.DataReceived, AddressOf handler1  
AddHandler serport.DataReceived, AddressOf handler2  

但是第二个处理程序不起作用。永远不会被召唤 我能做什么?

我还编写了这个例程来打开一个端口:

Public Function OpenSerial(ByRef serialport As String, ByVal receivehandler As SerialDataReceivedEventHandler) As SerialPort
    Dim ser As SerialPort
    ser = New System.IO.Ports.SerialPort(serialport, 115200, Parity.None, 8, StopBits.One)
    With ser
        .Handshake = Handshake.None
        .ReadBufferSize = 10000
        .ReadTimeout = 500
        .WriteBufferSize = 10000
        .WriteTimeout = 500
        .RtsEnable = True
        .DtrEnable = True
        AddHandler .DataReceived, receivehandler
        AddHandler .ErrorReceived, AddressOf sErrorHandler
        .Encoding = System.Text.Encoding.Default
        .Open()
        .DiscardOutBuffer()
    End With
    OpenSerial = ser
End Function

所以我想我可以用这种方式使用它:

Dim comSerial As SerialPort
comSerial = OpenSerial("COM1", AddressOf Handler1)

无论如何,但是我这样做我得到了相同的结果:第一次,第一个处理程序工作,重新定义时,即使端口关闭并重新打开,第二个处理程序永远不会得到
叫:(

2 个答案:

答案 0 :(得分:1)

这个问题是假的。

程序运行正常。由于其他原因,我没有收到任何数据。

答案 1 :(得分:0)

我这样做是因为我需要我的代码干净而不像往常那样乱糟糟的东西:)

无论如何设备一直在通信,我需要根据我需要做的不同类型的输出。

在一种情况下,我得到一些数据块,在其他情况下,我得到不同的数据,在其他情况下,我发送数据块。

这种做法非常有效(安全):

Public Sub OpenSerial(ByRef Serialport As String)
    comSerial = New System.IO.Ports.SerialPort(Serialport, 115200, Parity.None, 8, StopBits.One)
    With comSerial
        .Handshake = Handshake.None
        .ReadBufferSize = 10000
        .ReadTimeout = 500
        .WriteBufferSize = 10000
        .WriteTimeout = 500
        .RtsEnable = True
        .DtrEnable = True
        AddHandler .ErrorReceived, AddressOf sErrorHandler
        .Encoding = System.Text.Encoding.Default
        .Open()
        .DiscardOutBuffer()
        .DiscardInBuffer()
    End With
End Sub

然后我就像这样:

Sub Dump()
        comSerial.DiscardOutBuffer()
        comSerial.DiscardInBuffer()
        System.Threading.Thread.Sleep(1000)
        AddHandler comSerial.DataReceived, AddressOf DumpHandler
        {....DO THINGS....}
        RemoveHandler comSerial.DataReceived, AddressOf DumpHandler
        comSerial.DiscardOutBuffer()
        comSerial.DiscardInBuffer()
End Sub

每个子的不同处理程序 这很有效。
1000毫秒的等待仅仅是为了安全,但即使没有它,我也从未遇到过比赛状况。