代码之家  ›  专栏  ›  技术社区  ›  Zibri

serialport:更改DataReceivedHandler

  •  2
  • Zibri  · 技术社区  · 14 年前

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

    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 回复  |  直到 11 年前
        1
  •  1
  •   Zibri    14 年前

    这个问题是假的。

    程序运行良好。因为其他原因,我没有收到任何数据。

        2
  •  0
  •   Zibri    14 年前

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

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

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

    这种方法非常有效地做到了这一点(确保安全):

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