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 :

unix_kbhit()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut unix_kbhit()
    Bonsoir,

    Dans la fonction unix_kbhit() de la FAQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int unix_kbhit(void)
    {
      struct timeval tv = { 0, 0 };
      fd_set readfds;
     
      FD_ZERO(&readfds);
      FD_SET(STDIN_FILENO, &readfds);
     
      return select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1;
    }
    Que représente STDIN_FILENO ? JEne comprend pas pourquoi des que j'ai frapper la touche entrer une fois, il me la detecte comme frapper a chaque fois, comment faire pour reinitialiser cette fonction? Merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: unix_kbhit()
    Citation Envoyé par zbooon
    Dans la fonction unix_kbhit() de la FAQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int unix_kbhit(void)
    {
      struct timeval tv = { 0, 0 };
      fd_set readfds;
     
      FD_ZERO(&readfds);
      FD_SET(STDIN_FILENO, &readfds);
     
      return select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1;
    }
    Que représente STDIN_FILENO ?
    Le numéro de flux associé à stdin. On peut supposer que sur ta machine, stdin est raccordé au clavier. (ce qui est courant, mais pas obligatoire).
    Je ne comprend pas pourquoi des que j'ai frappé la touche entrer une fois, il me la detecte comme frappée a chaque fois, comment faire pour reinitialiser cette fonction?
    Tout simplement en effectuant une lecture de stdin avec une fonction qui fait une lecture directe dsans attente de <enter> commme un getch() (ncurse)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if (unix_kbhit())
      {
         int c = getch();
      }
    ... ou un getchar() mais avec un reglage spécial de stdin.

    C'est expliqué dans la FAQ :

    http://c.developpez.com/faq/c/tmp/?p...CREEN_mode_raw

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Par défaut
    Merci pour votre réponse,

    Malheuresement me voila confronté à un nouveau probléme, lorsque je saisie une touche elle ne s'affiche qu'avec un temp de retard, je ne comprend pas pourquoi, toute les lettres sont décalées. Sauf lorsque j'appuie sur la touche entrée qui actualise apparement tout d'un coup.
    Je m'explique lorsque j'appuie sur 'a' rien ne se passe, j'appuie sur 'b', 'a' s'affiche, j'appuie sur 'c' 'b' s'affiche....
    Je voudrais que lorsque j'appuie sur 'a', 'a' s'affiche directement et non aprés.

    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
    /*Permet d'envoyer une chaine de caractére et de l'afficher*/
    void trans_chaine(char car)
    {if(car=='\r'){printf("\r\n");}
    else{printf("%c",car);}
    }
     
    /*Permet de recevoire une chaine de caractére et de l'afficher*/
    void recv_chaine(char car)
    {char buffer[255]; int i=0;//Buffer
    }
     
    int main()
    {int fd;//Descripteur fichier du port serie
    char cara=0;
    fd_set setSerial;//Permet de savoir si on a recu des données
     
    /*On passe le terminal en mode raw pour gerer le kbhit()*/
    static struct termios cooked;
    struct termios raw;
    tcgetattr(STDIN_FILENO, &cooked);
    raw = cooked;
    cfmakeraw(&raw);
    tcsetattr(STDIN_FILENO, TCSANOW, &raw);
     
     
    //On initialise le port serie
    if((fd=init_com(COM3,SANS))==-1){return(-1);}
    printf("Port COM%d ouvert avec succés\r\n",COM3);
     
    while(cara!='q')
    {
    if(unix_kbhit())//s'il y a une frappe de clavier
     {cara=getchar();trans_chaine(cara);}
    }
     
    //On ferme correctement le port serie
    close(fd);
    //On repasse le terminal en mode normal
    tcsetattr(STDIN_FILENO, TCSANOW, &cooked);
    printf("Fermeture du programme\r\n");
    return(1);
    }

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