Serialport: Изменение DatareceivedHandler - PullRequest
2 голосов
/ 29 ноября 2010

При открытии порта добавляю обработчик и он работает.
В какой-то момент мне нужно поменять обработчик на другую подпрограмму ..
То, что я сделал, было:

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 ]

1 голос
/ 30 ноября 2010

Этот вопрос был поддельным.

Программа работает отлично.Я не получал никаких данных по другой причине.

0 голосов
/ 01 декабря 2010

Я делаю это, потому что мне нужно, чтобы мой код был чистым, а не беспорядочным, как обычно :)

Как бы то ни было, устройство постоянно общается, и мне нужно создавать различные типы выходов в зависимости от того, что мне нужно делать.

В одном случае я получаю несколько блоков данных, в другом случае я получаю другие данные, а в других я отправляю блоки данных.

Этот подход отлично работал, делая это (т.е. будьте в безопасности):

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 мс - просто для безопасности, но у меня до сих пор не было состояния гонки, даже без него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...