Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
963 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  pb gestion du TimeOut avec ReadFile

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pb gestion du TimeOut avec ReadFile

n°367785
jarod2000
Posté le 21-04-2003 à 17:12:21  profilanswer
 

Bonjour a tous !
Voila j'ai un probleme avec la gestion du TimeOut pour une lecteur sur le port COM. Dans mon exemple ci dessous j'attends un chaine de 19 caracteres pendant env 20 sec si au bout de ces 20 sec je recois rien je veux que mon programme reconnaisse qu'il y a u un timeout mais la é le probleme car quand je fais mon ReadFile, bResult se met a 1 ( donc bonne execution du ReadFile, d'ou il ne passe pas dans la boucles de gestion d'erreur ) comme si il avait recu quelque chose alors que aucunes information n'est passe par le port COM. Je comprends pas trop ou et le probleme :'(. Si quelqu'un pourrait m'aider ca serait bien gentils de sa part.
En vous remerciant par avance.
 

Citation :


#include "afx.h"
void main()
{
 OVERLAPPED gOverLapped;
 HANDLE hFile;
 DCB MonDCB;
 COMMTIMEOUTS MonCommTimeOuts;
 char inBuffer[20];
 unsigned long nBytesToRead=20;
 unsigned long nBytesRead=0;
 hFile=CreateFile("COM2",GENERIC_WRITE|GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
 if(hFile==INVALID_HANDLE_VALUE)
 {
  int ErreurCreateFile=GetLastError();
 }
 int Erreur1=GetCommState(hFile,&MonDCB);
 if(Erreur1==0)
 {
  int ErreurGetCommState=GetLastError();
 }
 MonDCB.BaudRate=CBR_9600;
 MonDCB.Parity=0;
 MonDCB.ByteSize=8;
 MonDCB.StopBits=0;
 int Erreur2=SetCommState(hFile,&MonDCB);
 if(Erreur2==0)
 {
  int ErreurSetCommState=GetLastError();
 }
 int Erreur3=GetCommTimeouts(hFile,&MonCommTimeOuts);
 if(Erreur3==0)
 {
  int ErreurGetCommState=GetLastError();
 }
 MonCommTimeOuts.ReadIntervalTimeout=500;
 MonCommTimeOuts.ReadTotalTimeoutMultiplier=1000;
 MonCommTimeOuts.ReadTotalTimeoutConstant=0;
 int Erreur4=SetCommTimeouts(hFile,&MonCommTimeOuts);
 if(Erreur4==0)
 {
  int ErreurSetCommTimeouts=GetLastError();
 }
// set up overlapped structure fields  
// to simplify this sample, we'll eschew an event handle  
gOverLapped.Offset     = 0;  
gOverLapped.OffsetHigh = 20;  
gOverLapped.hEvent     = NULL;  
int i;
for(i=0;i<=18;i++)
{
 inBuffer[i]=' ';
}
// attempt an asynchronous read operation  
DWORD bResult;
bResult=ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead,  
    &gOverLapped) ;  
// if there was a problem, or the async. operation's still pending ...  
if (!bResult)  
{  
 DWORD dwError;
    // deal with the error code  
    switch (dwError = GetLastError())  
    {  
        case ERROR_HANDLE_EOF:  
        {  
            // we're reached the end of the file  
            // during the call to ReadFile  
 
            // code to handle that  
        }  
        case ERROR_IO_PENDING:  
        {  
            // asynchronous i/o is still in progress  
             // do something else for a while  
 //           GoDoSomethingElse() ;  
             // check on the results of the asynchronous read  
            bResult = GetOverlappedResult(hFile, &gOverLapped,  
                &nBytesRead, FALSE) ;  
             // if there was a problem ...  
            if (!bResult)  
            {  
                // deal with the error code  
                switch (dwError = GetLastError())  
                {  
                    case ERROR_HANDLE_EOF:  
                    {  
                        // we're reached the end of the file  
                        //during asynchronous operation  
                    }  
                     // deal with other error cases  
                }  
            }  
        } // end case  
 
        // deal with other error cases  
    } // end switch  
} // end if  
CloseHandle(hFile);
}

mood
Publicité
Posté le 21-04-2003 à 17:12:21  profilanswer
 

n°368378
jarod2000
Posté le 22-04-2003 à 13:06:08  profilanswer
 

Up
Please c'est pour le projet de mon BTS.


Message édité par jarod2000 le 22-04-2003 à 20:01:22
n°369815
jarod2000
Posté le 23-04-2003 à 19:29:45  profilanswer
 

Up  
une ptite aide s'il vous plait

n°370360
Konar
Posté le 24-04-2003 à 13:36:44  profilanswer
 

veut pas te donner de faux espoirs mais :
 - bResult est un BOOL, pas un DWORD (c'est détail mais bon...)
 
 - Plus important, d'apres les msdn, pour ta struct OVERLAPPED :
OffsetHigh  
Specifies the high word of the byte offset at which to start the transfer. This member is ignored when reading from or writing to named pipes and communications devices and should be zero.  
 
 => donc je vois pas pkoi t'as mis 20. (pas critique non plus)
 
InternalHigh  
Reserved for operating system use. This member, which specifies the length of the data transferred, is valid when the GetOverlappedResult function returns TRUE.  
 
 => Vois du coté de la fct GetOverlappedResult(), tu devrais ptet t'en servir qqpart...
 
 - Et enfin, apres le ReadFile(), mates la valeur de nBytesRead, si celle-ci est a 0, aucune information n'a été lue (j'ai pas tout compris a ton pb, mais ca ressemblait a une histoire de "aucunes information n'est passe par le port COM", donc si nBytesRead est a 0, bah c bon, rien n'a été lu, et ce sans aucune erreur)
 
sinon me sert jms des overlapped et jms fait non plus de lecture de ports com, donc je peux pas t'en dire plus, ou si y a un autre pb dans ton code...
 
Edit :
Tu fais des overlapped reading, mais ton CreateFile() manque du flag FILE_FLAG_OVERLAPPED a dwFlagsAndAttributes.
 
Edit :
essayes avec le code d'ici :
http://msdn.microsoft.com/library/ [...] events.asp
 
en gros la difference par rapport a toi c'est que ca crée un event et ca attend (WaitCommEvent()) l'arrivée d'un evenement, puis ca devrait le traiter selon son type.
 
si je commence a comprendre ton code, toi tu initialises tout le bordel, puis tu fais direct un ReadFile() alors qu'il n'y a rien dans le port com. D'ou la création d'un evenement puis le wait.


Message édité par Konar le 24-04-2003 à 13:53:25

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  pb gestion du TimeOut avec ReadFile

 

Sujets relatifs
[DEBUTANT] pb concernant la gestion des droitsgestion des apostrophes
[PHP] Gestion courrier, documents....Cherche bibliothèque C/C++ pour gestion/décompression de flux video
gestion des chaines de caracteres[C++] Regler le timeout d'un connect (création d une Socket) URGENT
Gestion d entree sortie[Resolu] timeout sur un recv(...) ca existe?
Servlet :Gestion des sessions différente selon client IE6/Mozilla1.2.1comment baisser le timeout d'une exception??
Plus de sujets relatifs à : pb gestion du TimeOut avec ReadFile


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR