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

C Discussion :

Vider le buffer après un sleep ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut Vider le buffer après un sleep ?
    Bonjour à tous !

    Voilà je cherche en vain a vider mon buffer dans une boucle while qui lit le contenu de mon port série. Sur le port série est branché un lecteur de carte.

    Voici mon code d'origine :
    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
    while(1){
        /* Attente et lecture carte */
        printf("Attente lecture carte !\n");
        read(fd, recup_port, 13);
     
        /* Recuperation du numéro de carte */
        strcpy (carte_num, "");
        strncat (carte_num, &recup_port[7], 3);
        argv[2]=carte_num;    
     
        /* Envoie des données */  
        for(i=0;i<argc;i++) {      
          rc = send(sd, argv[i], strlen(argv[i]) + 1, 0);      
          if(rc<0) {
            perror("Ne peut pas recevoir les données ");
            close(sd);
            exit(1);    
          }
          printf("Envoie au serveur: %s\n",  argv[i]);
        }
     
        /* tempo evite d'endormir le programme de lecture sur la même carte */
        sleep(3);
     
        /* vider le buffer */
        //while ((c=getchar()) !='\n' && c !=EOF);
        //fflush(stdout);
        //fflush(stdin);
      }
    Comme vous pouvez le voir j'ai mis un sleep de 3 seconde, afin que le programme ne s'endorme pas sur la lecture de la même carte, afin d'éviter les doublons quand les personne laisse trop longtemps leur carte dans le lecteur. (Normalement ca doit être instantannée).

    Le problème est que pendant ce sleep le buffer continu à enmagasiner les données de la carte lue. J'esaye donc de vider le buffer après le sleep. mais je n'y arrive pas.

    J'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fflush(stdout);
    fflush(stdin);
    Mais ca ne vide rien !

    J'ai essayé ca aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c=getchar()) !='\n' && c !=EOF);
    Mais ca boucle indéfiniment sur cette boucle.

    Voilà, vous avez une idée ?
    Je positionne peut être mal le code, ou bien je n'utilise pas le bon code ?

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut Re: Vider le buffer après un sleep ?
    Je ne suis pas fort dans l'utilisation des ports séries mais lorsque je vois:

    Citation Envoyé par olivier857
    Voilà je cherche en vain a vider mon buffer dans une boucle while qui lit le contenu de mon port série.
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fflush(stdout);
    fflush(stdin);
    Je me dis:
    - Faire un flush de stdin n'a aucun sens et peut être cause d'ennuis! A ne pas utiliser!
    - En quoi stdin/stdout ont un rapport avec le port série?

    Donc pour ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c=getchar()) !='\n' && c !=EOF);
    Est-ce que tu crois vraiment que getchar va lire ce qui se trouve sur le port série?

    Jc

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut Re: Vider le buffer après un sleep ?
    Citation Envoyé par fearyourself
    Je ne suis pas fort dans l'utilisation des ports séries mais lorsque je vois:

    Citation Envoyé par olivier857
    Voilà je cherche en vain a vider mon buffer dans une boucle while qui lit le contenu de mon port série.
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fflush(stdout);
    fflush(stdin);
    Je me dis:
    - Faire un flush de stdin n'a aucun sens et peut être cause d'ennuis! A ne pas utiliser!
    - En quoi stdin/stdout ont un rapport avec le port série?
    Oui oui je sais très bien, les 2 non rien avoir, j'ai essayé en désespoire de cause. De plus je crois que le fflush() ne marche que pour les flux sortant et non entrants, fflush(stdin) ne doit pas marché.

    C'est pour ca que j'ai voulu tester çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c=getchar()) !='\n' && c !=EOF);

    Citation Envoyé par fearyourself
    Donc pour ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((c=getchar()) !='\n' && c !=EOF);
    Est-ce que tu crois vraiment que getchar va lire ce qui se trouve sur le port série?
    Bein justement je ne sais pas, c'est la 1ère fois que j'emploi le port série en C. Je ne sais donc pas comment vider le buffer.
    Si tu a une idée n'hésite pas ..., je suis preneur.

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ben il faut etre logique. Tu fais un read() sur le descripteur sd, qui correspond certainement a ton port serie. Donc le buffer que tu dois vider correspond a celui associe au descripteur sd. Il est evident que vider le buffer de stdin ne fera pas grand'chose a l'affaire.

    Il y a plusieurs post sur ce forum concernant la lecture propre d'un port, base sur read(), select() et consorts.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par DaZumba
    Ben il faut etre logique. Tu fais un read() sur le descripteur sd, qui correspond certainement a ton port serie. Donc le buffer que tu dois vider correspond a celui associe au descripteur sd. Il est evident que vider le buffer de stdin ne fera pas grand'chose a l'affaire.

    Il y a plusieurs post sur ce forum concernant la lecture propre d'un port, base sur read(), select() et consorts.
    Oui mais fflush(fd) ne marche pas non plus.

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par olivier857
    Citation Envoyé par DaZumba
    Ben il faut etre logique. Tu fais un read() sur le descripteur sd, qui correspond certainement a ton port serie. Donc le buffer que tu dois vider correspond a celui associe au descripteur sd. Il est evident que vider le buffer de stdin ne fera pas grand'chose a l'affaire.

    Il y a plusieurs post sur ce forum concernant la lecture propre d'un port, base sur read(), select() et consorts.
    Oui mais fflush(fd) ne marche pas non plus.
    fflush sert pour les flux sortants, flux étant des FILE*, toi tu passes un descripteur de fichier et c'est un flux entrant! Logique que cela ne marche pas.

    Si tu es sous linux, regardes du côté de select, cela te servira.

    De toute façon, tu seras contraint de faire un read sur ton descripteur fd. Le problème c'est que c'est bloquant donc il faut être sûr qu'il y a quelque chose à lire. D'où le select si tu es sous linux/unix.

    Jc

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par fearyourself
    fflush sert pour les flux sortants, flux étant des FILE*, toi tu passes un descripteur de fichier et c'est un flux entrant! Logique que cela ne marche pas.

    Si tu es sous linux, regardes du côté de select, cela te servira.

    De toute façon, tu seras contraint de faire un read sur ton descripteur fd. Le problème c'est que c'est bloquant donc il faut être sûr qu'il y a quelque chose à lire. D'où le select si tu es sous linux/unix.

    Jc
    ok merci je vais chercher autour de çà.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    170
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 170
    Points : 33
    Points
    33
    Par défaut
    Bon j'ai trouvé mieux.
    Il y a une fonction flush pour le port série:

    int tcflush(int fildes, int queue_selector);

    If queue_selector is TCIFLUSH it flushes data received but not read.
    If queue_selector is TCOFLUSH it flushes data written but not transmitted.
    If queue_selector is TCIOFLUSH it flushes both data received but not read and data written but not transmitted.

    Dans mon cas ca fait donc :

    Et ca marche nickel !

Discussions similaires

  1. Vider son buffer après un try-catch
    Par _concept_ dans le forum C++
    Réponses: 2
    Dernier message: 14/12/2011, 17h04
  2. Vider le buffer du clavier.
    Par Maglight dans le forum Delphi
    Réponses: 2
    Dernier message: 18/05/2006, 11h46
  3. [vb.net] Comment vider un buffer ?
    Par mdc dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/12/2003, 15h43
  4. Vider le buffer du clavier
    Par flavien tetart dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 12/07/2002, 08h35

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