Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG? [Résolu]

Coolpix08 150 Messages postés dimanche 14 mars 2004Date d'inscription 21 décembre 2007 Dernière intervention - 19 déc. 2007 à 18:27 - Dernière réponse : Coolpix08 150 Messages postés dimanche 14 mars 2004Date d'inscription 21 décembre 2007 Dernière intervention
- 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.....
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Coolpix08 150 Messages postés dimanche 14 mars 2004Date d'inscription 21 décembre 2007 Dernière intervention - 21 déc. 2007 à 10:00
3
Merci
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.

++

Merci Coolpix08 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 101 internautes ce mois-ci

Commenter la réponse de Coolpix08
cs_juju12 968 Messages postés samedi 3 avril 2004Date d'inscription 4 mars 2010 Dernière intervention - 19 déc. 2007 à 18:46
0
Merci
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.
Commenter la réponse de cs_juju12
Coolpix08 150 Messages postés dimanche 14 mars 2004Date d'inscription 21 décembre 2007 Dernière intervention - 20 déc. 2007 à 09:57
0
Merci
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!
++
Commenter la réponse de Coolpix08
Coolpix08 150 Messages postés dimanche 14 mars 2004Date d'inscription 21 décembre 2007 Dernière intervention - 20 déc. 2007 à 15:01
0
Merci
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.....
Commenter la réponse de Coolpix08

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.