[C]Nb de caracteres dans le buffer liaison série??

Nb de caracteres dans le buffer liaison série?? [C] - C - Programmation

Marsh Posté le 08-06-2005 à 17:12:42    

Bonjour,  
J'aimerais savoir s'il est possible de connaitre le nombre de caractere a lire dans le buffer de reception d'une liaison serie, pour etre sur apres de lire le bon nombre??  
Si oui, comment faut t'il faire, ya t'il des fonctions deja faites ou une instruction particuliere.Je sais qu'elle existe en VB (InBufferCount qui renvoie comme entier le nombre de caracteres a lire)  
Ou, si l'on est obligé d'aller voir directement dans le registre contenant le buffer de reception, comment y accede t'on??  
 
Merci
 

Reply

Marsh Posté le 08-06-2005 à 17:12:42   

Reply

Marsh Posté le 08-06-2005 à 20:28:18    

bonjour
 
g souvent manipule la liaison serie en c / c++ et c#
en c je receptionnais les valeurs dans un tableau dont je determine la taille selon ce que j'attendais en retour
 
vince

Reply

Marsh Posté le 09-06-2005 à 09:51:01    

Ben oui mais si je cherche a faire ca c'est que mon programme ne fonctionne pas je lis le nombre de caracteres que je devrais avoir mais il en reste encore apres ce qui n'est pas normal et je voulais donc effectuer un test avant chaque lecture pour savoir si le nb de caracteres attendus est bien le meme que le nb present dans le buffer.

Reply

Marsh Posté le 09-06-2005 à 14:11:49    

J'ai une petite question qui pourrait m'éclairer sur ce pb:
Ou va t'on lire lorsque l'on effectue un readfile dans la liaison série??

Reply

Marsh Posté le 09-06-2005 à 16:50:10    

crazyclimber a écrit :

J'ai une petite question qui pourrait m'éclairer sur ce pb:
Ou va t'on lire lorsque l'on effectue un readfile dans la liaison série??


Dans un buffer de réception...
 


---------------
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 09-06-2005 à 17:42:12    

bjr ,
 
effectiveemnt la fonction readfile prend en parametre un buffer qui recupere toutes les informations
moi je mettais un tableau de char pour recuperer tt ca et ca marche
regarde de plus pres le prototype de cette fonction
 
et apres mets un pt d'arret sur l'appel a cette fonction et un espion sur ton tableau de char ;)
 
vince

Reply

Marsh Posté le 15-06-2005 à 09:56:56    


ReadFile(hComm,&tabres,1,&nboctetlu,NULL);
 
Ici je donne le nombre de caracteres a lire (1) donc il faut bien que je le connaisse avant!!!!enfin pour ce que je veux faire!
Je ne peux pas faire comme tu dis winzo car si je mets un grand nombre le read se bloque en attnedant de lire la totalité des caracteres demandés.
 
 

Reply

Marsh Posté le 15-06-2005 à 11:03:21    

crazyclimber a écrit :

ReadFile(hComm,&tabres,1,&nboctetlu,NULL);
 
Ici je donne le nombre de caracteres a lire (1) donc il faut bien que je le connaisse avant!!!!enfin pour ce que je veux faire!
Je ne peux pas faire comme tu dis winzo car si je mets un grand nombre le read se bloque en attnedant de lire la totalité des caracteres demandés.


C'est pas le nombre de caractères à lire, mais la taille du buffer de reception. ReadFile fera ce qu'il peut dans la limite de la taille disponible. Le nombre réel de caractères placés dans le buffer est mis dans nboctetlu par la fonction.


   char tabres[128];
   unsigned nboctetlu;
 
   ReadFile (hComm, tabres, sizeof tabres, &nboctetlu, NULL);


après, si nboctetlu vaut 0, on a rien lu.
si il vaut 123, on a lu 123 char et ils sont dans tabres.
 
C'est une fonction de reception des plus classiques.
 
Si tu dois recevoir des chaines de caractères, je conseille ceci:


   char tabres[128 + 1];
   unsigned nboctetlu;
 
   ReadFile (hComm, tabres, sizeof tabres - 1, &nboctetlu, NULL);
   tabres[nboctetlu] = 0;
 


Il faut lire les docs. Si tu as du mal avec l'anglais, je te conseille de prendre des cours d'urgence. Il est indispensable dans ce métier de savoir lire l'anglais technique (c'est pas difficile, et en France, l'anglais est obligatoire, donc, pas d'excuse pour les bases, à part une capillarité palmaire aigüe ...).


Message édité par Emmanuel Delahaye le 15-06-2005 à 11:07:23

---------------
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 16-06-2005 à 09:57:17    

IFilesystem::ReadFile
Prototype
 
void IFilesystem::ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD NumberOfBytesToRead, DWORD& NumberOfBytesRead) const;
 
Description
 
This function reads data from a file. Note that due to implementation issues, in the current version of rfstool, the whole file is read to memory first.
 
Input
 
HANDLE hFile - Filehandle previously allocated by IFilesystem::OpenFile
 
LPVOID lpBuffer - Pointer to a BYTE buffer to receive the file data
 
DWORD NumberOfBytesToRead - Size of the Buffer pointed to by lpBuffer
 
DWORD& NumberOfBytesRead - Reference to a DWORD that will receive the number of bytes actually retrieved. This might be less than NumberOfBytesToRead, indicating end-of-file.
 
Output
 
None
 
Je veux bien que ce soit la taille du buffer de reception c'est ecrit mais alors faut que les gars qui ecrivent les docs soient logiques parce que jusqu'à preuve du contraire  
"NumberOfBytesToRead" ca veut dire nombre de caracteres a lire!!!!!
 
C'est pas avec l'anglais que j'ai un pb c'est avce le C!!!
 

Reply

Marsh Posté le 16-06-2005 à 10:29:28    

A moins que ce soit toi qui ait un problème avec  l'anglais....  
 
Parce que sur tous les tutoriels sur la liaison série c'est explicitement écrit "nb de caracteres a lire" et non taille du buffer!  :whistle:  
Si j'augmente ce nombre le read se bloque car il attend le nb de caracteres demandés et ils n'arrivent jamais!!!
 
 
En tout cas je connais peu de monde sur les forums qui comme toi on du mal à se remettre en question et a respecter les debutants!!Un peu de compassion, tu devrais prendre exemple sur d'autres sites "www.siteduzero.com"
Sur ce, bon apprentissage de l'anglais!!! :)


Message édité par crazyclimber le 16-06-2005 à 10:32:02
Reply

Marsh Posté le 16-06-2005 à 10:29:28   

Reply

Marsh Posté le 16-06-2005 à 11:43:33    

crazyclimber a écrit :

A moins que ce soit toi qui ait un problème avec  l'anglais....


C'est possible.

Citation :

Parce que sur tous les tutoriels sur la liaison série c'est explicitement écrit "nb de caracteres a lire" et non taille du buffer!


L'important est le commentaire et non le nom plus ou moins fantaisiste et confusant du paramètre

Citation :

DWORD NumberOfBytesToRead - Size of the Buffer pointed to by lpBuffer


"Size of the Buffer pointed to by lpBuffer" signifie "Taille du tampon pointé par lpBuffer"
 
Moi, j'essaye de t'aider. Maintenant, tu peux essayer de faire le mariole, ça ne m'interesse pas.


---------------
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 16-06-2005 à 14:54:38    

Le commentaire est dans beaucoup de cas: nBytesToRead -> nb de caracteres a lire.
 
Mais sans vouloir polémiquer, si je suis ta méthode et que je donne un buffer de 50  
 
char *tabres=new char[50];  
 
ReadFile(hComm,&tabres,50,&nboctetlu);
 
je devrais avoir une case de mon tableau remplie( si je lis un seul caractere bien entendu) par le read apres la fin de l'instruction.
Or lorsque j'essaye, le Read bloque, c'est à dire qu'il attend de lire les suivantes mais il n'y en a pas donc il reste bloqué!!
 
Ou est donc la solution???
 
 
 
 
 

Reply

Marsh Posté le 16-06-2005 à 15:47:57    

crazyclimber a écrit :

Le commentaire est dans beaucoup de cas: nBytesToRead -> nb de caracteres a lire.
 
Mais sans vouloir polémiquer, si je suis ta méthode et que je donne un buffer de 50  
 
char *tabres=new char[50];  
 
ReadFile(hComm,&tabres,50,&nboctetlu);
 
je devrais avoir une case de mon tableau remplie( si je lis un seul caractere bien entendu) par le read apres la fin de l'instruction.
Or lorsque j'essaye, le Read bloque, c'est à dire qu'il attend de lire les suivantes mais il n'y en a pas donc il reste bloqué!!
 
Ou est donc la solution???


C'est parce que le ReafFile() est blocant. On peut effectivement savoir ce qu'il y a à lire avant avec ClearComm().


/* ---------------------------------------------------------------------
   --------------------------------------------------------------------- */
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;
}


avec  


struct comm
{
/* structure de configuration du port */
   DCB dcb;
 
/* structure de configuration des delais du port */
   COMMTIMEOUTS to;
 
/* handle de la comm */
   HANDLE h;
 
/* derniere erreur */
   comm_err_e last_err;
 
/* Derniere emission sans erreur */
   ulong last_sent;
};


Message édité par Emmanuel Delahaye le 16-06-2005 à 15:49:50

---------------
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 17-06-2005 à 11:59:13    

Ben voilà, c'est tout ce que je demandais, c'éytait pas la peine de me prendre pour un gland des le départ!!!
Allez merci et sans rancune. ;)  
   

Reply

Sujets relatifs:

Leave a Replay

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