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 :

Faire un menu type console en C embarqué


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Faire un menu type console en C embarqué
    Bonjour,

    Je cherche à faire un petit menu en C pour permettre à un utilisateur de choisir par 3 choix, 2 de ces choix doivent amener l'utilisateur à entrer 2 autres informations.

    1 Ajouter un numero de telephone -> Entrer la position ou le stocker (0-100) -> Entrer le numero de telephone
    2 Supprimer un numero de telephone -> Entrer la position ou il se trouve (0-100)
    3 Afficher la liste des numéros

    L'utilisateur entre les informations par l'interface serie, un buffer appelé uart2_buffer contient ce qu'il tape dès qu'il termine par la touche [ENTREE]

    J'ai fait ceci, mais je suis bloqué car je ne sais pas comment laisser le programmer tourner et permettre a l'utilisateur de rentrer les données via le menu :

    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
    int choix;
    unsigned char uart2_buffer[30];
     
    choix = atoi(uart2_buffer);
     
     
      switch (choix)
    {
    case 1:     // Ajouter un numéro
      putrsUART2("Entrer la position du numero a ajouter-> ");
      uart2_buffer[0] = '\0';
      break;
     
    case 2:     // Supprimer un numéro
      putrsUART2("Entrer la position du numero a supprimer-> ");
      uart2_buffer[0] = '\0';
      break;
     
    case 3:     // Liste des numéros
      putrsUART2("Liste des numeros\r\n");
      uart2_buffer[0] = '\0';
      break;
     
     
    default:    // ne fait rien dans les autres cas
    //     putrsUART2("choix non disponible");
    break;
    }

    Lorsque l'utilisateur tape sur 1 puis [entrée] , uart2_buffer contient "1 et le caractère de fin :\0"
    Lorsque le programme tourne et que uart2_buffer ="1\0", on rentre dans le case 1 et on en sort aussitot, pour éviter de boucler et d'afficher sans cesse le message : "Entrer la position du numero a ajouter->", je vide uart2_buffer.

    A partir de ce point je ne sais pas comment faire pour attendre que l'utilisateur rentre une position comprise entre 1 et 100 et ensuite le numéro de téléphone sur 10 chiffres.

    Pourriez vous m'aider svp ?
    Merci beaucoup,

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    872
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 872
    Par défaut
    Bonjour,

    La fonction fgets te permettra de récupérer la ligne entrée par l'utilisateur. Après tu pourras convertir le résultat grâce à atoi (mais utiliser strtol serait mieux).

    Après pour obtenir les infos supplémentaires, un petit if et c'est réglé. Après pour que ton programme tourne en permanence, tu fais un while dans lequel tu mets une variable avec une valeur qui ne pourra être changé que via une option d'un menu (un truc du genre "voulez-vous quitter ?").

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Le but est ici de recevoir ou d'envoyer les données ? Tu parles d'embarqué mais sur quelle architecture et avec quel compilateur travailles-tu ?

    Avant de s'attaquer au problème d'UART, as-tu essayé de faire un programme sur PC qui remplace les envoies série par de simples printf() ?

    Lorsque l'utilisateur tape
    Je ne vois rien dans ton code pour taper quelque chose...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int choix;
    unsigned char uart2_buffer[30];
    choix = atoi(uart2_buffer); 
    switch (choix)....
    Tu n'initialise pas le buffer donc le résultat de atoi() va te donner une valeur aléatoire (correspondant à la valeur aléatoire contenu dans le buffer). Il y a même une chance non négligeable que cela te retourne 0 car atoi() échouera à convertir la chaine qui pourrait bien ne pas représenter un nombre qui tient dans un int. 30 digits, ça fait un sacré nombre ! A titre d'exemple, quelques lignes en Python pour trouver la longueur de la chaine de caractères qui représentera le plus grand int d'un système 32 bits :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> sys.maxint
    2147483647
    >>> hex(2147483647)
    '0x7fffffff'
    >>> len(str(2147483647))
    10
    D'ailleurs, atoi() pose le soucis de la vérification d'erreur : utilise plutôt strtol() si tu as besoin de t'assurer que la conversation s'est bien passée. http://linux.die.net/man/3/atoi

    on rentre dans le case 1 et on en sort aussitot, pour éviter de boucler et d'afficher sans cesse le message
    Il n'y a pas de boucle dans ton programme.... De quoi parles-tu ?

    Mets un peu au clair ce que tu souhaites faire, en français, sous forme algorithmique. Tant que ça ne sera pas clair, ce n'est pas la peine de te lancer dans le code

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci à vous,
    Je vais essayer de vous donner davantage d'informations :

    Mon compilateur est un compilateur C appelé XC8 de Microchip, il permet de compiler du C et l'injecter dans un microcontrolleur.

    Je ne vois rien dans ton code pour taper quelque chose...
    C'est vrai en effet, et c'est normal car la table uart2_buffer est une variable qui se remplie automatiquement à chaque fois que l'on rentre des données au clavier, ceci est fait grâce à un sous programme d'interruption qui est déja fonctionnel. ( c'est une fonctionnalité du C embarqué )

    Je cherche à afficher un menu à l'utilisateur lorsqu'il se connecte avec un PC via l'interface série avec le logiciel hyperterminal.
    Le but est d'entrer des choix et des données au clavier, ces informations sont stockées dans uart2_buffer à chaque fois que l'utilisateur presse la touche entrée.

    Chaque nouvelle saisie au clavier suivi de [entrée] remplace le contenu précédent stocké dans uart2_buffer.

    La fonction putrsUART2 permet d'afficher du texte sur l'écran hyperterminal pour la rendre visible à l'utilisateur ( je l'ai testé elle fonctionne bien )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    putrsUART2("affiche du texte");
    --

    Dans mon message précédent, je parlais de boucle car j'ai placé le switch case dans la boucle infini du programme, ainsi le switch case est sans cesse parcouru.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai fait une fois un programme sur un PIC pour lui envoyer des commandes par UART. Tu reçois caractère par caractère dans ton UART, si c'est bien fait par interruption (et non par attente active ou polling). Comment remplis-tu ton buffer ? Quand décides-tu d'aller le lire ?

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    La reception sur l'uart est effectivement faite caractère par caractère grâce à une interruption.

    C'est transparent pour le fonctionnement pour le reste programme situé dans la boucle infinie.

    Justement, comment pourrais je procéder pour non seulement afficher un menu, tout en laissant l'utilisateur répondre aux choix et ne pas stoper le déroulement du reste du programme.

    Le mini code que j'ai posté fonctionne bien pour afficher les 3 choix sur Hyperterminal, mon soucis c'est afficher les sous-choix à l'utilisateur en fonction de sa réponse.

    Si on prend l'exemple du choix 1 :
    L'utilisateur voit le menu sur son écran de PC via hyperterminal ( c'est le code switch case de mon premier post, l'affichage fonctionne bien, le programme parcourt bien le bon case en fonction de se que rentre l'utilisateur au clavier.

    Mon problème, c'est la suite :

    Une fois rentré dans le case 1, il faut demander à l'utilisateur de rentrer une position au clavier, par exemple 5 et [ENTREE], ici les choses se corsent car il faut s'assurer que l'utilisateur n'a saisie une valeur inattendue qui planterai le programme (ici, il faut que l'utilisateur rentre un chiffre compris entre 1 et 100) une fois cette valeur reçue, il faut demander à l'utilisateur de rentrer le numéro de téléphone sur 12 chiffres, là encore il faut faire un petit code qui empêcherait d'accepter des lettres ou caractères spéciaux par exemple.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Pour le case 1, j'ai fait ceci mais le programme n'arrive à sortir du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(uart2_buffer != '\0');

    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
    long int position = 0;
     
    ...
     
     while (1)
    {
     
    position = strtol(uart2_buffer,0,10);
    switch (position)
    {
     
    case 1:     // Supprimer un numéro de téléphone
      putrsUART2("Entrer la position du numero a supprimer-> ");
      uart2_buffer[0] = '\0';
     
      while(uart2_buffer != '\0');
     
      position = strtol(uart2_buffer,0,10);
        if(position < 101u)
            {
            putrsUART2("Entrer le numero de telephone (max 12 chiffres) : \r");
            uart2_buffer[0] = '\0';
            }
      break;
     
    ...
     
    default:    // ne fait rien dans les autres cas
    //     putrsUART2("choix non disponible");
    break;
    }
    }

Discussions similaires

  1. Réponses: 11
    Dernier message: 01/07/2012, 15h12
  2. Réponses: 1
    Dernier message: 09/11/2006, 12h39
  3. [menu]faire un menu déroulant
    Par Nadine dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 24/03/2005, 08h33
  4. Faire disparaître menu lors de l'impression
    Par jackrabbit dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 19/12/2004, 20h56

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