begin process at 2012 02 13 02:24:06
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

System

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 19 décembre 2007 à 18:27:08 | Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

Coolpix08

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.....
mercredi 19 décembre 2007 à 18:46:46 | Re : Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

juju12

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.
jeudi 20 décembre 2007 à 09:57:51 | Re : Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

Coolpix08

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!
++
jeudi 20 décembre 2007 à 15:01:19 | Re : Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

Coolpix08

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.....
vendredi 21 décembre 2007 à 10:00:35 | Re : Port COM : ReadFile == TRUE et nbreadbyte = 0 ??? BUG?

Coolpix08

Réponse acceptée !
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.

++


Cette discussion est classée dans : fonction, port, true, readfile, com


Répondre à ce message

Sujets en rapport avec ce message

Port série [ par cheMoor ] Bonjour,Merci Ymca2003 de ton aide, ton programme semblé super, mais je n'arrive pas à le tester (car il est programmé en Visual C++ « les boutons, l fonction lire ds un port série [ par imanewin32 ] pour réaliser la lecture ds un prog qui gére la communication atravers un port série,j'ai réalisé le codeDWORD comserie::lectport(char* e,int t){ Set Prbl avec la fonction htons(port) [ par KissyFroth ] J'ai un probleme avec cette fonction mais je ne sais pas très bien quel est son role. Je ne sais pas non plus selon quels critères on choisit le "port CreateFile et port COM supérieur à 9 [ par agremlins ] Bonjour,J'ai une dll qui s'occupe de la connexion avec des périphériques branchés sur le port série.J'utilise La fonction CreateFile pour ouvrir un po Affichage de texte sur Zone de Control sous conditions [ par develdelphi ] Bonjour,Voila j'ai un grand programme Visual C++ qui au demarrage fait des initialisations sur differents parametres.J'ai donc un Dialog  (IDD_SYSTEME Ecriture port série --> Erreur 997 [ par julienbj ] Bonjour,Je suis en train de développer une petite classe (si on peut appeler ca comme ca en C) pour piloter mes ports séries.Rien de bien compliqué en aide à la fonction OpenCom [ par sondos01 ] Bonjour, Je voulais comprendre quelque chose dans la fonction OpenCom (langage C) ci dessous. J'envoie des informations du Pc au microcontroleur par l Comment savoir le nomdu processus utilisant un port COM? [ par Coolpix08 ] Bonjour à  tous,    Voila je n'ai pas trouvé la réponse à ma question dans le forum alors je viens poser ma pierre à l'immense édifice déjà batti!!    qextserialport [ par naddoush ] salut tlm, je veux commander le port serie (qui est relié à un port infrarouge) pour qu'il me permettra de zapper sur les chaines de téle. alors j'ai


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales