Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

Résolu
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 - 19 déc. 2007 à 18:27
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 - 21 déc. 2007 à 10:00
Bonsoir à tous!!!

    Je crois que je viens de découvrir un bug de la fonction ReadFile...........enfin j'espere pas!!!!
    Ca fait lontemps que j'utilise le port COM mais je n'avais jamais vu un truc pareil...
    Voila je vous explique la manip...

    Je commence par ecrire un grand nombre d'octet sur le port COM avec la fonction WriteFile() // le nombre doctet depends du port COM et du hardware...( chez moi j'utilise une MOXA PCI 4 ports et je n'envoie que 55 octets...ouais cest peu surtout qu'à 40 octets ca passe...)
    et je fait aussitot un ReadFile (avec un timeout de 100ms mais peu importe)
    et la ...pouf! le ReadFile retourne aussitot TRUE mais le nombre d'octet qu'il a lu est de 0!!!!

    Je ne comprend absolument pas pourquoi elle retourne TRUE alors qu'elle n'a pu rien lire...
    En mettant un Sleep(100); entre les 2 cela passe nickel mais j'aimerais bien comprendre ce qu'il se passe...

    Mon hypothèse est que la fonction WriteFile retourne en meme temps qu'elle écrit sur le port COM et du coup au moment du ReadFile, le Handle est occupé ou utilisé je sais pas très bien. Cela ne doit pas etre tres bien gérer et ne le voit pas comme erreur et retourne true.....mais ca crin....

    Une solution :  avoir une fonction qui permet de savoir si le Handle est OK ou BUSY mais je trouve rien du tout sur le net, je sais meme pas si ca existe ou si mon hypothèse est vrai

HELP....plz.....

4 réponses

Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
21 déc. 2007 à 10:00
Re tous le monde!!!

     Je viens poster pour conclure, c'est jai enfin résolue le problème. En mattant les OVERLAPPED je me suis apercu de quelque truc sur les timeout super intéressant ainsi que la configuration que je fesais a moitié.

    A ne pas oublier :

ReadFile sets this value to zero (0) before doing any work
or error checking. If this parameter is zero (0) when
ReadFile returns TRUE on a named
pipe, the other end of the message mode pipe calls the
WriteFile function with
nNumberOfBytesToWrite set to zero (0).
    -> toujours à zero!!! quoi qu'il arrive !
   
    Merci juju12 d'avoir répondu.

++
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
19 déc. 2007 à 18:46
Dans ta fonction WriteFile tu peux passer une structure OVERLAPPED avec un membre hEvent qui déclenche un événement quand WriteFile a fini d'écrire donc essaie avec ça : tu crées un évènement, tu appelles WriteFile et tu fais suivre par WaitForSingleObject.
0
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
20 déc. 2007 à 09:57
Salut!!

    Merci beaucoup d'avoir répondu!
    J'avais vaguement vu cette structure dans les méandre de MSDN...
    Un evenement pour bien vérifier la fin d'envoie me parait la meilleur solution.
    Je teste ca aujourdhui et je reposte une reponse complète pour confirmer!

Encore merci!
++
0
Coolpix08 Messages postés 150 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 21 décembre 2007 2
20 déc. 2007 à 15:01
Bon je commence à me mettre la corde au cou...

    Donc lhistoire de OVERLAPPED c'est simplement pour les communications asynchrones et uniquement lorsque le WriteFile ou le ReadFile retourne false ( donc une erreure ) la on peut gérer le reste. Mais la je dois rester en synchrone.

    Dans mon cas, la fonction WriteFile retourne toujours vrai et se retourne seulement quand tous les octets sont envoyés (vérification par ClearCommError()).
    Ainsi que la fonction ReadFile retourne true alors qu'elle devrait pas et me dit qu'elle a lu 0 octet ...
    De plus la fonction reste bloqué dans cette état la jusqu'à ce que le prochain WriteFile "débloque" la situation. ( plusieur ReadFile de suite avec un Sleep(1000)! entre chaque..et rien à faire elle reste bloquée )

    J'ai carrement mis du debug partout dans ma fonction decriture et de lecture en utilisant la fonction ClearCommError() et tous ce qu'il va bien autour...et....snif...aucune erreur n'en ressort...tous nickel...

    Du coup mon hypothèse de base est fausse . Et le pire c'est que ca le fait 1 fois tous les 20-30 fois d'apres le debug....

SVP...plz....jcrack complement la.....
0
Rejoignez-nous