2010-11-29 17 views
2

Lors de l'ouverture du port, j'ajoute le gestionnaire et cela fonctionne.
Ce que je besoin est, à un moment donné, de changer le gestionnaire à un autre sous-programme ..
Ce que je faisais était:Serialport: Modification de DatareceivedHandler

AddHandler serport.DataReceived, AddressOf handler1 

Et le premier gestionnaire a fonctionné comme prévu ...
après un certain temps code I faire:

RemoveHandler serport.DataReceived, AddressOf handler1 
AddHandler serport.DataReceived, AddressOf handler2 

Mais le deuxième gestionnaire ne fonctionne pas. on ne l'appelle jamais.
Que puis-je faire?

J'ai également codé cette routine pour ouvrir un port:

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 

Je pensais pouvoir l'utiliser de cette manière:

Dim comSerial As SerialPort 
comSerial = OpenSerial("COM1", AddressOf Handler1) 

Quoi qu'il en soit, mais je le fais-je obtenir le même résultat: la première fois, le premier gestionnaire fonctionne, une fois redéfini, même si le port est fermé et rouvert, le deuxième gestionnaire ne reçoit jamais
appelé: (

+0

Une description de l'application nous aiderait à voir ce que vous essayez de faire. Une chose que je remarque est que vous n'avez aucun handshaking et puis allumez RTS. Comme Hans l'a dit, l'utilisation d'un booléen permet au gestionnaire d'effectuer deux choses différentes. – dbasnett

Répondre

1

Cette question était bidon.

Le programme fonctionne correctement. Je ne recevais aucune donnée pour une autre raison.

0

Je fais cela parce que je besoin de mon code pour être propre et non un désordre comme d'habitude :)

l'appareil Quoiqu'il en soit est en communication tout le temps et je dois Magae différents types de sorties en fonction de ce que je besoin de faire.

Dans un cas, je reçois des blocs de données dans d'autres cas, je reçois des données différentes et dans d'autres j'envoyer des blocs de données.

Cette approche a fait parfaitement ce (te être sûr):

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 

Ensuite, je dois sous-marins comme ceci:

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 

Et différents gestionnaires pour chaque sous.
Cela fonctionne très bien.
L'attente de 1000 ms est juste pour la sécurité mais je n'ai jamais eu de condition de course jusqu'à maintenant, même sans elle.