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 :

Conversion HEXA -> ASCII pour affichage LCD


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Conversion HEXA -> ASCII pour affichage LCD
    Bonjour a tous,
    Je programme en ce moment un PIC18F877.
    Je dois acquerir une chaine de caracteres en HEXA, puis l'afficher sur un LCD
    Cependant, j'ai qques problemes avec la conversion.
    Voici le programme que j'ai fait;
    Citation Envoyé par CODE SS FONCTION
    char conversion(char y)
    {
    for(y=0x00;y<=0x09;)
    {
    y = y+0x30;
    }
    for(y=0x0A;y<=0x0F;)
    {
    y = y+0x37;
    }
    return y;
    }
    Je lui envoie une tableau,je fais tourner cette sous fonction avec une boucle for et il me renvoie "AAAAAAAA" (par RS232)
    Extrait de ma boucle a la con:
    for(x=7;x<16;x++)
    {
    tabconv[x] = conversion(tab[x]);

    }
    Je ne comprend pas mon erreur,
    Je sais qu'il y en a une mais je ne la comprend pas.
    A l'avance merci de votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Points : 675
    Points
    675
    Par défaut
    Citation Envoyé par MarcO_-
    Bonjour a tous,
    for(y=0x00;y<=0x09
    {
    y = y+0x30;
    }
    for(y=0x0A;y<=0x0F
    {
    y = y+0x37;
    }
    A mon avis, c'est plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(y>=0x00 && y<=0x09)
    {
      y = y+0x30;
    }
    else if(y>=0x0A && y<=0x0F;)
    {
      y = y+0x37;
    }

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par MarcO_-
    Bonjour a tous,
    Je programme en ce moment un PIC18F877.
    Je dois acquerir une chaine de caracteres en HEXA, puis l'afficher sur un LCD
    Cependant, j'ai qques problemes avec la conversion.
    Voici le programme que j'ai fait;


    Je lui envoie une tableau,je fais tourner cette sous fonction avec une boucle for et il me renvoie "AAAAAAAA" (par RS232)
    Extrait de ma boucle a la con:


    Je ne comprend pas mon erreur,
    Je sais qu'il y en a une mais je ne la comprend pas.
    A l'avance merci de votre aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // from i int [0:15] to c char : hex representation of i
    char conversion(int i)
    {
    static char *hexchars = "0123456789ABCDEF" ;
     
        assert((i>=0) && (i<16));
        return hexchars[i];
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par JeitEmgie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // from i int [0:15] to c char : hex representation of i
    char conversion(int i)
    {
    static char *hexchars = "0123456789ABCDEF" ;
     
        assert((i>=0) && (i<16));
        return hexchars[i];
    }
    Pas mal. Attention, assert() n'est pas compilé en mode Release... J'aurais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* /!\ N'est pas une chaine valide */
    static char const hexchars[16] = "0123456789ABCDEF" ;
    Ca prend moins de place (important en embarqué, surtout PIC où chaque byte compte).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int conversion (size_t i)
    {
       int c = -1;
       /* /!\ N'est pas une chaine valide */
       static char const hexchars[16] = "0123456789ABCDEF" ; 
     
       if (i < 16)
       {
          c = hexchars[i];
       }
       return c;
    }
    http://emmanuel-delahaye.developpez....tes.htm#size_t
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci a tous!
    Ca marche!

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int conversion (size_t i)
    size_t est normalement utilisé pour exprimé "la taille" de quelque chose…
    ici c'est plutôt "unsigned" qui exprimerait le mieux le type de paramètre que l'on attend…

    et quitte à être strict, c'est un char que l'on renvoit par un int…
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char conversion (unsigned i)
    car en supposant que l'on puisse renvoyer -1 vous obligez un test côté appelant… (vous pourriez plutôt renvoyer '\0' … ce qui "terminera" proprement la chaîne accumulée par l'appelant au premier paramètre out of range…)

    et en tenant compte du contexte embarqué on pourrait même "pousser le bouchon" jusqu'à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char conversion (unsigned i)
    {
       static char const hexchars[16] = "0123456789ABCDEF" ; 
     
       return hexchars[i % 16];
    }
    à l'utilisateur de voir ce qui lui convient le mieux…

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par JeitEmgie
    size_t est normalement utilisé pour exprimé "la taille" de quelque chose…
    ici c'est plutôt "unsigned" qui exprimerait le mieux le type de paramètre que l'on attend…
    Ici, OK. Mais d'une manière générale, un size_t est le bon type pour un indice (ici, i est un indice...)
    et quitte à être strict, c'est un char que l'on renvoit par un int…
    Euh, renvoyer un char ? jamais vu ça. C'est techniquement possible, mais dans la pratique on ne le fait pas, car ça génère du code inutilement complexe. Rien de tel dans la bibliothèque C, par exemple...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char conversion (unsigned i)
    car en supposant que l'on puisse renvoyer -1 vous obligez un test côté appelant… (vous pourriez plutôt renvoyer '\0' … ce qui "terminera" proprement la chaîne accumulée par l'appelant au premier paramètre out of range…)
    Je préfère une valeur volontairement hors gamme et testable. Ce n'est pas un hasard si getchar(), par exemple, renvoi un int...
    et en tenant compte du contexte embarqué on pourrait même "pousser le bouchon" jusqu'à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char conversion (unsigned i)
    {
       static char const hexchars[16] = "0123456789ABCDEF" ; 
     
       return hexchars[i % 16];
    }
    à l'utilisateur de voir ce qui lui convient le mieux…
    La correction d'erreur silencieuse n'est pas le meilleur moyen de rendre son code fiable...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Euh, renvoyer un char ? jamais vu ça. C'est techniquement possible, mais dans la pratique on ne le fait pas, car ça génère du code inutilement complexe. Rien de tel dans la bibliothèque C, par exemple...
    ben voyons :
    étant donné que l'on assigne le résultat extrait d'un tableau de char à des éléments d'un autre tableau de char, autant renvoyé un char… de toute façon le compilateur va arranger cela à sa sauce en fonction du CPU cible…

    mais la vraie bonne façon d'être efficace ici est évidemment de ne pas faire une fonction pour si peu !


    Citation Envoyé par Emmanuel Delahaye
    Je préfère une valeur volontairement hors gamme et testable. Ce n'est pas un hasard si getchar(), par exemple, renvoi un int...
    avec getchar() (toutes les fonctions du genre) c'est parce que on a besoin de tester EOF ((int)-1) et que l'on ne veut pas s'emmêler les pinceaux avec l'extension de signe du caractère ASCII 255…

    Citation Envoyé par Emmanuel Delahaye
    La correction d'erreur silencieuse n'est pas le meilleur moyen de rendre son code fiable...
    certes,
    mais dans le contexte embedded ici décrit c'est l'utilisateur qui sait à quel niveau il doit placer les checks de validité des données qu'il manipule…
    et en général quand on programme ce genre d'application, on évite de mettre ces tests dans les feuilles de l'arbre d'appels des fonctions parce que cela complique le code et que l'on n'a pas nécessairement la place en ROM pour faire ce que l'on ferait dans une application "desktop"…

    (et mettre une chaîne "0123456789ABCDEF" dans une static d'une sous-routine alors qu'il y 9 chances sur 10 qu'on en aura besoin ailleurs n'est pas non plus quelque chose que je laisserais ainsi pour du code "embedded"…)

    mais,
    il faudrait peut-être aussi le laisser faire ses devoirs tout seul comme un grand, non ?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par JeitEmgie
    il faudrait peut-être aussi le laisser faire ses devoirs tout seul comme un grand, non ?
    Ce n'est pas moi qui ai posté la première solution. Une fois la boite de Pandore ouverte, advienne que pourra...
    (et mettre une chaîne "0123456789ABCDEF" dans une static d'une sous-routine alors qu'il y 9 chances sur 10 qu'on en aura besoin ailleurs n'est pas non plus quelque chose que je laisserais ainsi pour du code "embedded"…)
    OK.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    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
    Citation Envoyé par JeitEmgie
    étant donné que l'on assigne le résultat extrait d'un tableau de char à des éléments d'un autre tableau de char, autant renvoyé un char…
    Renvoyer un int n'est pas particulierement choquant. Je suis sur qu'il t'arrive de faire:
    Pourtant, 'A' est de type int en C...

  11. #11
    Candidat au Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'aurai une autre petite question a vous poser.
    Je souhaite separer un mot hexa en 2.
    de maniere a avoir :

    Debut : 0xA8 dans un tableau
    Fin : 0x0A et 0x08 dans un autre tableau a la suite l'un de l'autre.

    J'ai testé en "divisant" par 16,
    mais ca ne marche pas,
    voici un extrait du code que j'ai testé :
    SOUS PROGS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char division(char x)
    {
       x = x%16;
       return x;
    }
     
    char divi2(char y)
    {
       y = y/16;
       return y;
    }
    MAIN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(k=0;k<7;k++)
         {
         tab2[k] = division(tab[k]);
         tab2[k+1] = divi2(tab[k]);
         }
    Encore merci pour tous vos conseils!

  12. #12
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par MarcO_-
    J'aurai une autre petite question a vous poser.
    Je souhaite separer un mot hexa en 2.
    de maniere a avoir :

    Debut : 0xA8 dans un tableau
    Fin : 0x0A et 0x08 dans un autre tableau a la suite l'un de l'autre.
    Il suffit de faire quelque chose dans ce genre :
    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
    #include <stdio.h>
     
    int main(void)
    {
        unsigned char tab[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
        char tab2[16];
        int i, k;
     
        for(i=0, k=0; k<8; k++)
        {
            tab2[i++] = (tab[k]>>4) & 0x0F ;
            tab2[i++] = tab[k] & 0x0F;
        }
     
        for (i=0; i<16; i++)
        {
            printf("0x%02X\n", tab2[i]);
        }
     
        return 0;
    }
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion hexa/hexa représenté en ASCII
    Par sone47 dans le forum C++
    Réponses: 1
    Dernier message: 24/08/2010, 17h42
  2. conversion hexa ASCII
    Par xtimas dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/05/2010, 07h25
  3. Conversion hexa ascii
    Par omisc dans le forum Débuter
    Réponses: 1
    Dernier message: 20/05/2008, 18h42
  4. Conversion flux binaire -> ascii -> hexa
    Par identifiant_bidon dans le forum C++
    Réponses: 15
    Dernier message: 15/11/2007, 09h25
  5. Conversion hexa-BCD en assembleur pour intel 8085
    Par stgi02 dans le forum Assembleur
    Réponses: 4
    Dernier message: 08/08/2006, 13h46

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