2010-11-29 2 views
2

포트를 열면 처리기가 추가되어 작동합니다.
나는 어떤 시점에서 .. 또 다른 서브 루틴에 처리기를 변경하는 것입니다 필요가있는 무엇
내가 무슨 짓을했다 :Serialport : DatareceivedHandler 변경

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

응용 프로그램에 대한 설명은 사용자가하려는 일을 파악하는 데 도움이됩니다. 내가 알아 차리는 한 가지는 핸드 쉐이크가 없으면 RTS를 켤 수 있다는 것입니다. 한스 (Hans)가 말했듯이, 부울을 사용하면 처리기가 두 가지 다른 작업을 수행하게됩니다. – dbasnett

답변

1

이 질문은 가짜입니다.

프로그램이 정상적으로 작동합니다. 다른 이유로 데이터를받지 못했습니다. 내가 깨끗해야하는 코드 및

은 어쨌든 장치가 모든 시간을 통신 :) 평소와 같이하지 엉망이 필요하고 내가 무엇에 따라 출력의 다른 유형을 magae해야하기 때문에

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 

그리고 다른 핸들러.
매우 잘 작동합니다.
1000ms 대기는 안전을위한 것입니다.하지만 지금까지는 아무런 경쟁 조건도 없었습니다.

관련 문제