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

  FORUM HardWare.fr
  Programmation
  C

  C: Readfile()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C: Readfile()

n°1084273
Zelltempla​r
Posté le 15-05-2005 à 16:13:45  profilanswer
 

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 ^^

mood
Publicité
Posté le 15-05-2005 à 16:13:45  profilanswer
 

n°1084296
Emmanuel D​elahaye
C is a sharp tool
Posté le 15-05-2005 à 16:36:07  profilanswer
 

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/
n°1084905
Zelltempla​r
Posté le 15-05-2005 à 23:28:52  profilanswer
 

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???

n°1084927
HelloWorld
Salut tout le monde!
Posté le 15-05-2005 à 23:50:07  profilanswer
 

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

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

  C: Readfile()

 

Sujets relatifs
ReadFile / WriteFile en multiThreadheader Content-Disposition: attachment et readfile()
fopen ou readfileRécupérer le contenu d'un fichier distant. readfile(), include().
pb gestion du TimeOut avec ReadFileGérer les retours à la ligne avec des include ou readfile....
[PHP] mise à jour de site à l'aide de la fonction readfile() 
Plus de sujets relatifs à : C: Readfile()


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