打开端口时,我添加了处理程序,它可以正常工作
我需要的是,在某种程度上,将处理程序更改为另一个子程序。
我做的是:
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)
无论如何,但是我这样做我得到了相同的结果:第一次,第一个处理程序工作,重新定义时,即使端口关闭并重新打开,第二个处理程序永远不会得到
叫:(
答案 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毫秒的等待仅仅是为了安全,但即使没有它,我也从未遇到过比赛状况。