pb gestion du TimeOut avec ReadFile

pb gestion du TimeOut avec ReadFile - C++ - Programmation

Marsh Posté le 21-04-2003 à 17:12:21    

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);
}

Reply

Marsh Posté le 21-04-2003 à 17:12:21   

Reply

Marsh Posté le 22-04-2003 à 13:06:08    

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


Message édité par jarod2000 le 22-04-2003 à 20:01:22
Reply

Marsh Posté le 23-04-2003 à 19:29:45    

Up  
une ptite aide s'il vous plait

Reply

Marsh Posté le 24-04-2003 à 13:36:44    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed