Existe-il cette exception ?

Signaler
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
-
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
-
Bonjour, je voudrais savoir s'il existe une exception qui détecte la réception d'un caractère sur le port COM ouvert ?



j'ai vu par hasard qu'il existe ce type de chose en Java, à savoir :

SerialPortEventListener

Le but est de déclencher la lecture des caractères que quand je sais qu'un message arrive.
Sinon, je n'arrive plus à fermer le port quand je boucle dessus en lecture infiniment.

Merki d'avance

8 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Salut tu confonds exception et évènement, une exception est levée seulement quand une erreur "inattendu" à lieu ( d'où le nom ).

En .Net 2.0 la classe SerialPort a un event DataReceived entre autre.. ( pas testé )

Pour ReadFile as tu regardé la page MSDN ?
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Oui c vrai, je fais encore des confusions avec ces termes exceptions, évènements, je pensais en effet à évènement.



Oui, j'ai regardé la page msdn pour readfile, mais bon, si tu as une
idée derrière la tête, je t'en prie, ne te gêne pas pour moi, car là je
sais pas vers quoi me tourner. Sur la page en question, je sais pas ce
que je cherche donc c un peu plus dur.



Je vais aller y re-jeter un oeil... Sait-on jamais, une illumination ? :p
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Déjà y'à un truc que je comprends pas, c ca :



ReadFile sets this value to 0 (zero) before doing any work or error checking. If this parameter is 0 (zero) when
ReadFile returns TRUE on a named pipe, the other end of the message mode pipe calls the
WriteFile function with nNumberOfBytesToWrite set to 0 (zero).



Moi le prototype de ma fonction me retourne un int, pas un bool.... :-/

Ou alors j'ai encore rien compris...
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
ReadFile c'est pas simple et encore moins avec PInvoke ! Voilà comment j'écrirais le prototype managé:



// Avec Overlapped.
[ DllImport( "kernel32.dll", SetLastError = true ) ]
private static extern bool ReadFile( IntPtr handle, [ Out ] byte[ ] buffer, uint bytesToRead, out uint bytesRead, ref NativeOverlapped overlapped );


// Sans Overlapped.
[ DllImport( "kernel32.dll", SetLastError = true ) ]
private static extern bool ReadFile( IntPtr handle, [ Out ] byte[ ] buffer, uint bytesToRead, out uint bytesRead, IntPtr overlapped );


Y'a d'autres possibilités encore, notamment avec le code unsafe.


Le 2ème prototype te permet de passer un IntPtr.Zero si tu n'utilises pas la structure overlapped.


System.Threading.NativeOverlapped est la version managée de overlapped.


Un point très important c'est le out devant bytesRead, ca remplace le passage par pointeur du C/C++ et ca permet à une fonction de renvoyer plusieurs valeurs, au retour de la fonction la valeur aura changé, ( si tout va bien ).


La fonction retourne un bool mais elle pourrait retournée un int, car en C un BOOL c'est un int et 0 est égale à false et tout ce qui n'est pas 0 ( même négatif ) c'est true, cette notion n'existe plus en C#.
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Lut Lutinore,



voilà le protoype de ma fonction ReadFile :

[DllImport("kernel32.dll")]

static extern int ReadFile(uint
hFile, Byte[] Buffer, int nNumberOfBytesToRead, ref int
lpNumberOfBytesRead, IntPtr notUsedPassZero ) ;


Alors après, j'ai pris non overlapped, car j'ai lu que c t
le meilleur choix. Ca viendrait de là que la fonction readfile ne
retourne pas tant qu'elle n'a pas lu le nb d'octets attendus. C'est le
mode non overlapped qui fait ca, et par cette méthode empêche toute
autre fonction d'accéder au port série, et donc bien sur, ma fonction
closehandle, c bien ca tu crois ?



Si tu as une idée de comment, soit que la fonction retourne, pour que
je puisse sortir de ma boucle, soit de pouvoir forcer la fermeture du
port....

En gros, pour l'instant j'en serais réduit à ceci :

si je veux fermer le port sur mon PC A. Il faut que j'envoie un octet
depuis le PC B sur le port en lecture du PC A pour qu'il veuille bien
sortir de la fonction readfile, pour enfin le fermer. C'est pas très
pratique, lol



Syl20
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
38
Oui je pense qu'il faut que tu utilises le mode overlapped, pour travailler de manière asynchrone.

MSDN:
If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is not NULL, the read operation starts at the offset specified in the OVERLAPPED structure and ReadFile may return before the read operation has been completed.

>> http://www.codeproject.com/dotnet/DotNetComPorts.asp
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Merci pour le lien, je vais devoir y jeter un oeil attentionné.



Je viens de survoler pour voir de koi ca causait, et j'ai découvert une petite fonction que je vais tester :



/// <summary>

/// The CancelIo function cancels all pending input and output

/// (I/O) operations that were issued by the calling thread for

/// the specified file handle. The function does not cancel I/O

/// operations issued for the file handle by other threads.

/// </summary>

[DllImport("kernel32.dll")]

private static extern Boolean CancelIo

(

IntPtr hFile

);


Si ca pouvait stopper toutes les opérations en cours qui accède à mon hFile, ca résoudrait le problème ...

Je te tiens au courant.

PS : t'es sur que tu verrais ca en asynchrone toi ? Non parceque j'ai
lu que c t déconseillé, et puis je sais pas si j'arriverais à le mettre
en place.
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
6
Bon, j'ai essayé d'utiliser CanceIO(hFile) mais ca ne marche pas car je
l'appelle dans l'évènement form1.Closed, et il est précisé que cette
fonction annule toutes les opérations du même thread, et la lecture se
fait dans un thread particulier.

Je ne vois pas comment je peux faire pour appeler CancelIO dans mon thread de lecture.

Si je veux le mettre dans la boucle de lecture, il ne sera exécuté que
si l'instruction passe la ligne ReadFile, càd si des caractères sont
recus. Si pas de caractère recu, et bien encore une fois je reste
bloqué sur ReadFile, à moins bien sur de faire en overlapped.



Je crois que ds le code en question de ton ex, il passe une structure overlapped. Mais j'ai pas très bien saisi le sens.