C: Readfile()

C: Readfile() - C - Programmation

Marsh Posté le 15-05-2005 à 16:13:45    

Bonjour,
Je dois ecrire en C un programme qui communique avec le port série. Dans la fonction readfile, il y a un champs ou il faut mettre le nombre de caractères que l'on veut recevoir. Le probleme c'est que je ne connais pas à l'avance le nombre de caractères que je vais recevoir, alors je met un nombre volontairement élevé, par exemple 100, mais si la personne d'en face m'envoie que 18 caracteres, alors la fonction readfile reste en attente d'un autre caractere. Comment faire pour qu'elle s'arrete? Merci d'avance et dites moi si je n'ai pas été assez clair ^^

Reply

Marsh Posté le 15-05-2005 à 16:13:45   

Reply

Marsh Posté le 15-05-2005 à 16:36:07    

Zelltemplar a écrit :

Je dois ecrire en C un programme qui communique avec le port série. Dans la fonction readfile,


Si tu veux dire 'ReadFile()', j'enclenche le mode Windows.

Citation :

il y a un champs ou il faut mettre le nombre de caractères que l'on veut recevoir.


Non. C'est un champ où l'on indique le nombre max de caractères lus en une fois. Ca dépend essentiellement de ton tableau de char. Mettons qu'il fasse 128 char, tu passes 128 si les données sont de type binaire, ou 128-1 si c'est du texte, de façon à le transformer en chaine en utilisant le nombre réel de caractères reçus pour placer un 0 dans le tableau.

Citation :


Le probleme c'est que je ne connais pas à l'avance le nombre de caractères que je vais recevoir, alors je met un nombre volontairement élevé, par exemple 100, mais si la personne d'en face m'envoie que 18 caracteres, alors la fonction readfile reste en attente d'un autre caractere. Comment faire pour qu'elle s'arrete? Merci d'avance et dites moi si je n'ai pas été assez clair


Il faut jouer sur la configuration du flux (paramètres de CreateFile). J'utilise ça:


         this->h = CreateFile (strport, GENERIC_READ | GENERIC_WRITE
                               ,0
                               ,NULL
                               ,OPEN_EXISTING
                           ,FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING
                               ,NULL);


et voici ma lecture non blocante:


/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
size_t comm_read_non_blocking (comm_s * this, char *buf, size_t size, comm_err_e * p_err)
{
   size_t nb_car_lus = 0;
   comm_err_e err = COMM_OK;
 
   if (this != NULL)
   {
 
      if (this->h != 0)
      {
         COMSTAT Stat;
         DWORD Errors;
         WORD nCarALire;
         DWORD NCarLus = 0;
 
         /* Pour connaitre le nombre d'octets dans le buffer d'entree */
         ClearCommError (this->h, &Errors, &Stat);
         nCarALire = Stat.cbInQue;
 
         /* On effectue la lecture si il y a des caracteres presents */
         if (nCarALire > 0)
         {
            PRINTF ((MODULE "nCarALire=%lu" EOL, (ulong) nCarALire));
 
            if (nCarALire > size)
            {
               nCarALire = size;
            }
 
            if (ReadFile (this->h, buf, nCarALire, &NCarLus, NULL) == 0)
            {
               err = COMM_ERR_RECEPTION;
            }
         }
         nb_car_lus = NCarLus;
      }
      else
      {
         /* Le port n'a pas ete ouvert */
         err = COMM_ERR_CREATION;
      }
 
      this->last_err = err;
 
   }
   else
   {
      err = COMM_ERR_CONTEXTE;
   }
 
   if (p_err != NULL)
   {
      *p_err = err;
   }
 
   return nb_car_lus;
}


 
Détails sur http://msdn.microsoft.com


Message édité par Emmanuel Delahaye le 16-05-2005 à 06:28:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 15-05-2005 à 23:28:52    

ok merci, mais ca me semble bien compliqué, c'est pourtant quelque chose de courant de ne pas connaitre la taille des données à recevoir! Il n'y a pas un autre moyen???

Reply

Marsh Posté le 15-05-2005 à 23:50:07    

Il faut configurer le timeout comme tu le veux via SetCommTimeouts. Au delà du timeout spécifié la lecture s'arrêtera et ReadFile renverra 0. Se fier à lpNumberOfBytesRead pour savoir combien d'octets ont été lus.
http://msdn.microsoft.com/library/ [...] serial.asp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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