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