Problème de fermeture de SerialPort

Yann47
Problème de fermeture de SerialPort

Je transforme une appli VB 2003 vers VB 2005.
En 2003 j'utilisait MSCOM pour recevoir des lignes de texte sur Com1.
En 2005 j'utilise le nouveau composant SerialPort.

J'ai réglé le problème de Tread-Safe avec la commande
Control.CheckForIllegalCrossThreadCalls = False
ou en utilisant "InvokeRequired" avec un Delegate.

Le probleme est à la fermeture du SerialPort "SerialPort.Close" ou à la fermeture directe du Form, j'ai le message
"L'opération d'entrée/sortie a été abandonnée en raison de l'arrêt d'une thread ou à la demande d'une application." et l'appli se bloque.

L'erreur se produit dans la procédure SerialPort1_DataReceveid

v_String=me.serialPort1.ReadLine

J'ai essayé plusieurs méthodes, dont une après avoir fermé SerialPort, l'application était bloquée et la réception des lignes continuait à s'enregistrer.

La définition de SerialPort.Close : Ferme la connexion au port, affecte à la propriété IsOpen la valeur false et supprime l'objet Stream interne.

Je pense que le Stream est supprimé avant la fermeture éffective du Port.

Merci de me renseigné sur ce problème.

fredericmazue

Bonjour,

Je dois dire que j'ai du mal à comprendre ton problème, que je n'ai jamais rencontré sous VS2005 mais je vais quand même essayer de t'aider.

Quote:

J'ai réglé le problème de Tread-Safe avec la commande
Control.CheckForIllegalCrossThreadCalls = False
ou en utilisant "InvokeRequired" avec un Delegate.

Tout ça me paraît parfaitement inutile avec VS2005

Quote:

Je pense que le Stream est supprimé avant la fermeture éffective du Port.

Je pense le contraire.
En natif, la programmation du port série se fait avec des entrées/sorties asynchrones ou "pendantes" et ceci dans des threads qui se mettent en attente d'une fin d'opération d'E/S.

Sous .Net 2005 toute cette cuisine est encapsulée et évidement masquée au codeur, mais il me semble qu'en arrière plan le runtime de .Net suis exactement la démarche requise (requise au dire même de Microsoft) à savoir les E/S pendantes.

Donc pour fermer le port, il faut à priori que ce soit possible au sens natif du terme, c'est à dire qu'une E/S ne soit pas pendante. Donc dans un premier temps et sous réserve de comprendre mieux ton problème, je te suggère de fermer ton port ainsi:

while (serialport.BytesToRead != 0)
{
serialport.ReadLine();
}
serialport.Close();				

Quote:

La définition de SerialPort.Close : Ferme la connexion au port, affecte à la propriété IsOpen la valeur false et supprime l'objet Stream interne.

Sous réserve que le thread (interne au runtime) qui lit dans le flux puisse être arrêté ce qui à priori nécessite qu'il n'y ait pas une E/S pendantes.

Enfin si j'ai bien compris ton problème... Fais l'essai et dis nous ce que ça donne. Et éventuellement poste un peu de code pour qu'on se fasse une idée plus précise.