Vb.net Serialport:更改DatareceivedHandler

Vb.net Serialport:更改DatareceivedHandler,vb.net,serial-port,Vb.net,Serial Port,打开端口时,我添加了处理程序,它就工作了。 我需要的是,在某个时刻,将处理程序更改为另一个子例程。 我所做的是: AddHandler serport.DataReceived, AddressOf handler1 第一个处理程序按预期工作… 在代码中使用一段时间后,我会: RemoveHandler serport.DataReceived, AddressOf handler1 AddHandler serport.DataReceived, AddressOf handler2

打开端口时,我添加了处理程序,它就工作了。
我需要的是,在某个时刻,将处理程序更改为另一个子例程。
我所做的是:

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)
无论如何,不管我怎么做,我都会得到相同的结果:第一次,第一个处理程序工作,当重新定义时,即使端口关闭并重新打开,第二个处理程序也永远不会得到

这个问题是假的


程序运行正常。我没有收到任何数据是因为另一个原因。

我这样做是因为我需要我的代码像往常一样干净,不乱:)

不管怎样,设备一直在通信,我需要根据我需要做的事情来管理不同类型的输出

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

这种方法在这样做时非常有效(请注意安全):

然后我有这样的潜艇:

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毫秒的等待只是为了安全,但我从来没有一个比赛条件,直到现在,即使没有它

对应用程序的描述将帮助我们了解您正在尝试执行的操作。我注意到的一件事是,你没有握手,然后打开RTS。正如Hans所说,使用布尔值可以让处理程序执行两种不同的操作。
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