IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Fonction api win32 ReadFile : lire trame de longueur inconnue?


Sujet :

Visual C++

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2008
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 10
    Par défaut Fonction api win32 ReadFile : lire trame de longueur inconnue?
    Bonjour,
    Je dois lire des trames d'octets sur le port série sans connaître la longueur de celles çi. Pour cela je fourni un buffer à la fontion ReadFile ainsi que sa taille. En utilisant le mode OVERLAPPED, je voudrais pouvoir réceptionner les trames sans attendre que le buffer soit plein (dans le cas où les trames sont moins longues que la taille du buffer, le cas pratique à priori ).

    Voiçi mon code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    int main(int argc, char* argv[])
    {
    	HANDLE h;
    	DWORD result=0;
    	DWORD rdMask=0;
    	OVERLAPPED osReader = {0};
    	OVERLAPPED osWriter = {0};
     
     
     
    	char buff[] = "bonjour";
    	char buffR[50];
     
     
     
     
    	h = McxOpenInit("\\\\.\\COM3"); /* fonction qui ouvre le port de comm en mode overlap*/
     
    	if(h == INVALID_HANDLE_VALUE) 
    	{
    		cout<<"erreur init"<<endl;
    		return (-1);
    	}
     
    	SetCommMask(h, EV_RXCHAR);
    	osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    	osWriter.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
     
    	if ( osReader.hEvent == NULL || osWriter.hEvent == NULL )
    	{
    	   // Error creating overlapped event; abort.
    	   cout<<"erreur creation ev"<<endl;
    	   return (-1);
    	}
     
     
            /*envoie une chaine de test, un autre programme (avec un autre port com) recoie la chaîne et renvoit une réponse immédiate)*/
    	if(!WriteFile(h,buff, sizeof(buff), &result,&osWriter))
    	{
    		if(GetLastError() != ERROR_IO_PENDING)
    		{
    			cout<<"erreur de write"<<endl;
    			return (-1);
    		}
     
    		else
    		{
                            //attente écriture terminée
    			if( !GetOverlappedResult(h, &osReader, &result, true) )
    			{
    				cout<<"erreur overlap write"<<endl;
    				return (-1);
    			}
     
     
    			else
    			{
    				cout<<"chaine envoyee"<<endl;
    			}
    		}
     
    	}
     
            /*lecture d'une chaine provenant du port série, on ne connait pas sa taille qui est à priori inférieure à la taille du buffer*/
    	if( !ReadFile(h, buffR, sizeof(buffR), &result, &osReader) )
    	{
    		if(GetLastError() != ERROR_IO_PENDING)
    		{
    			cout<<"erreur de read"<<endl;
    			return (-1);
    		}
     
    		else
    		{
    			if( !GetOverlappedResult(h, &osReader, &result, true) )
    			{
    				cout<<"erreur overlap write"<<endl;
    				return (-1);
    			}
     
    			else
    			{
    				buffR [result] = 0;
    				cout<<buffR<<endl;
    			}
    		}
     
    	}
     
    	else
    	{
    		//lecture immédiate
    		buffR [result] = 0;
    		cout<<buffR<<endl;
    	}
     
     
    	CloseHandle(h);
     
    	return 0;
    }

    Ce programme fonctionne presque. Tant que le buffer "buffR" de réception n'est pas plein, le programme n'affiche pas la châine ( la fonction GetOverlappedResult bloque le programme). Je voudrais savoir si il est possible de récupérer directement un train d'octet sans attendre d'avoir lu autant de caractère que la taille du buffer de réception (50).

    Je sais que c'est possible avec les sockets et la fonction recv dont l'appel se termine même si le buffer n'est pas plein et qui renvoie le nombre d'octet lu qui peut être inférieur à la taille de buffer.

    Pour les services de fichier, pas moyen d'avoir le même comportement?

    Merçi d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Tu dois pouvoir faire des réglages avec SetCommTimeouts

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2010, 20h23
  2. Réponses: 7
    Dernier message: 07/06/2008, 23h46
  3. Réponses: 4
    Dernier message: 16/01/2007, 13h16
  4. Réponses: 2
    Dernier message: 13/06/2006, 20h47
  5. [API Win32] Fonction ShellExecute
    Par akrodev dans le forum Windows
    Réponses: 11
    Dernier message: 30/05/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo