2013-04-08 1 views
0

Je travaille sur ce que je crois devoir être un simple programme que j'ai parcouru et tout ce que je peux trouver est un truc pour C#, C++.Obtenir des frappes de clavier en direct pour exécuter la fonction en C

Ce que je voudrais accomplir est de commencer mon programme écrit en C et le faire écouter pour certaines frappes. J'ai une fonction écrite qui va déplacer un servo donc je voudrais intégrer les flèches haut et bas pour exécuter la fonction de déplacer le servo dans un sens ou dans l'autre. Est-ce possible dans C?

+0

Oui, c'est possible, mais pas avec std C, ce que vous voulez faire est spécifique au système d'exploitation. Quel est votre système ciblé? – Mike

+0

Si vous parlez de Linux, il y a beaucoup de bibliothèques qui vous permettent de le faire. Ou même vous pouvez lire '/ dev/input/eventX' directement. –

+0

Oui, j'utilise linux 'Raspbian' pour être exact – Yamaha32088

Répondre

3

Travaillez-vous sous Linux ou Windows? Basé sur cela, il existe des alternatives qui peuvent être utilisées. Si vous travaillez sur Windows, une fonction devrait vous être familière: kbhit()? Bien qu'il soit maintenant obsolète, sa connaissance pratique pourrait être utile :) En supposant que vous travaillez sur Linux, avez-vous essayé NCurses?

de Taken [Ici]: (http://www.linuxmisc.com/9-unix-programmer/d5b30f8d1faf8d82.htm)

Le problème est triple:

  1. Vous devez vérifier si les données sont disponibles sans bloquer. Un simple 'read' ou fgets 'ou quoi que ce soit va bloquer votre processus jusqu'à ce que les données sont disponibles - vous ne voulez pas cela.
  2. Vous devez ignorer toute mise en mémoire tampon car sinon vous devrez vérifier à la fois le tampon et le périphérique .
  3. Vous devez contraindre le pilote de terminal pour vous donner des données comme il est disponible plutôt que d'accumuler le tout dans une ligne .

De la même page:

Cela dit, je vous présente le maladroit, le code hâtivement écrit, décommentée suivant, qui peut être instructif ou non (édité en partie par moi, il manquait entre parenthèses et non indenté)

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 
#include <sys/time.h> 
#include <sys/types.h> 

static struct termios orig_term; 
void u_cleanup(void) 
{ 
    tcsetattr(0, TCSANOW, &orig_term); 
} 
int u_kbhit(void) 
{ 
    struct termios t; 
    int ret; 
    fd_set rfd; 
    struct timeval to; 
    static int first_hit=0; 
    if(first_hit==0) 
    { 
     if(tcgetattr(0, &t)!=0) exit(0); 
     orig_term=t; 
     cfmakeraw(&t); 
     if(tcsetattr(0, TCSANOW, &t)!=0) exit(0); 
     atexit(u_cleanup); 
     first_hit=1; 
    } 

    FD_ZERO(&rfd); 
    FD_SET(0, &rfd); 
    to.tv_sec=0; 
    to.tv_usec=0; 
    if(select(1, &rfd, NULL, NULL, &to)==1) return 1; 
    return 0; 
} 
int u_getchar(void) 
{ 
    int ret; 
    fd_set rfc; 
    unsigned char buf; 
    if(read(0, &buf, 1)!=1) ret=0; 
    else ret=buf; 
    return ret; 
} 

int main(void) 
{ 
    while(1) 
    { 
     if(u_kbhit()) 
     { 
      int key=u_getchar(); 
      printf("hit: %d\r\n", key); 
      if(key==3) 
      { 
       printf("you hit control-c\r\n"); 
       exit(0);       
      }   
     } 
     usleep(100); 
    } 
    return 0; // inaccessible code, to prevent compiler warning 
} 
Questions connexes