Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 55 sur 55

Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa



  1. #31
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa


    ------

    Peut-être que le w de WriteUART devrait être en majuscule. EDIT: grillé

    Sinon, j'ai une autre proposition de code, sans appel aux librairies :
    Code:
    char c1, c2;
    
    /* premier chiffre hexa */
    c1 = argv[2][0];
    while (c1 != 0) {
      if (c1>=65 && c1<=70) /* A - F */
        c1 -= 55;
      else
      if (c1>=97 && c1<=102) /* a - f */
        c1 -= 87;
      else
      if (c1>=48 && c1<=57) /* 0 - 9 */
        c1 -= 48;
      else
        break; /* aucun chiffre -> ne rien faire */
    
      /* second chiffre hexa */
      c2 = argv[2][1];
      if (c2>=65 && c2<=70) /* A - F */
        c2 -= 55;
      else
      if (c2>=97 && c2<=102) /* a - f */
        c2 -= 87;
      else
      if (c2>=48 && c2<=57) /* 0 - 9 */
        c2 -= 48;
      else {
        /* cas d'un seul chiffre present */
        c2 = c1;
        c1 = 0;
      }
    
      while( BusyUART() );
      WriteUART( (c1<<4)|c2 );
    }

    -----

  2. Publicité
  3. #32
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Mon code donne les résultats suivants:

    Code:
    ""    -> rien
    "*"   -> rien
    "*12" -> rien
    "A"   -> 0Ah
    "0B"  -> 0Bh
    "00D" -> 00h
    "C27" -> C2h
    "E*"  -> 0Eh
    "E8*" -> E8h
    "fc"  -> FCh
    "cD"  -> CDh
    où * est n'importe quel caractère non hexadécimal

    .
    Dernière modification par PA5CAL ; 31/03/2009 à 16h39.

  4. #33
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Ca compile, c'etait les "W"

    par contre il doit y avoir un pb de conversion car quand je tape 40 dans ma textbox, ce n'est pas 01000000 qui est envoyé sur le port série.

    J'ai essayé
    Code:
    value = strtoul(argv[2],NULL,16)
    mais ça ne résout pas le pb.

  5. #34
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    seb.26,

    il y doit avoir un pv dans votre code ce qui est entrée dans la textbox ne renvoi pas une chaine hexa vers le port du pic

    j'utilise :
    Code:
      value = strtoul(argv[2],NULL,16);
    pa5cal,

    J'ai essayé votre code mais j'ai une erreur de syntaxe sur :
    Code:
    char c1, c2;

  6. #35
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lcoulon Voir le message
    J'ai essayé votre code mais j'ai une erreur de syntaxe sur :
    Code:
    char c1, c2;
    Ah bon ?

    1. vérifie que tu as placé cette déclaration de variables au bon endroit (au début de la fonction)

    2. essaye :
    Code:
    char c1;
    char c2;
    3. vérifie que le compilateur supporte bien les noms de variable contenant des chiffres

  7. #36
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Oui, toujours erreur de syntaxe

    Code:
    case CGI_CMD_SERIAL:	// ACTION=6
    
    char c1;
    char c2;
    
    /* premier chiffre hexa */
    c1 = argv[2][0];
    while (c1 != 0) {
      if (c1>=65 && c1<=70) /* A - F */
        c1 -= 55;
      else
      if (c1>=97 && c1<=102) /* a - f */
        c1 -= 87;
      else
      if (c1>=48 && c1<=57) /* 0 - 9 */
        c1 -= 48;
      else
        break; /* aucun chiffre -> ne rien faire */
    
      /* second chiffre hexa */
      c2 = argv[2][1];
      if (c2>=65 && c2<=70) /* A - F */
        c2 -= 55;
      else
      if (c2>=97 && c2<=102) /* a - f */
        c2 -= 87;
      else
      if (c2>=48 && c2<=57) /* 0 - 9 */
        c2 -= 48;
      else {
        /* cas d'un seul chiffre present */
        c2 = c1;
        c1 = 0;
      }
    
      while( BusyUART() );
      WriteUART( (c1<<4)|c2 );
    }

  8. Publicité
  9. #37
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lcoulon Voir le message
    Oui, toujours erreur de syntaxe

    Code:
    case CGI_CMD_SERIAL:	// ACTION=6
    
    char c1;
    char c2;
    Et pour cause. La déclaration qui crée l'erreur doit être au début de la fonction. C'est le langage C qui l'exige.

    Là elle se trouve de toute évidence à l'intérieur d'un "case", donc forcément pas au début.

  10. #38
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Merci beaucoup PA5CAL, votre code fonctionne parfaitement .
    Quand je tape une valeur décimale dans ma textbox, c'est bien sont équivalent en Hexa qui est envoyé sur le port série du Pic.

    Quand je tape "40" dans la textbox j'obtiens le code Ascii "@" sous hyperterminal soit l'equivalent hexa "0x40" : ça marche bien !

    ---------

    En revanche, le code de seb.26 mais il ne fonctionne pas comme je voudrai :

    en base 16, avec
    Code:
    value = strtoul(argv[2],NULL,16);
    Lorsque je tape "40" dans la textbox, j'obtiens le code Ascii losange sous hyperterminal.

    Lorsque je tape "63" dans la textbox, j'obtiens le code Ascii "6" sous hyperterminal.



    Pourriez vous me dire ou se situe le problème ?
    Merci à vous,

  11. #39
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lcoulon Voir le message
    Lorsque je tape "40" dans la textbox, j'obtiens le code Ascii losange sous hyperterminal.

    Lorsque je tape "63" dans la textbox, j'obtiens le code Ascii "6" sous hyperterminal.

    Pourriez vous me dire ou se situe le problème ?
    Le caractère losange (♦) correspond au code 04h et le caractère '6' correspond au code 36h.

    Il y a une inversion entre les 4 bits de poids fort et les 4 bits de poids faible.

  12. #40
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    ... La seule explication que j'y vois pour l'instant, c'est que la librairie contenant la fonction strtoul() n'a pas dû être compilée avec les bonnes options, ou bien est issue d'un code qui n'était pas prévu pour ce processeur (ça ressemble à une inversion entre Little-Endian et Big-endian).

  13. #41
    Seb.26

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lcoulon Voir le message
    seb.26,

    il y doit avoir un pv dans votre code ce qui est entrée dans la textbox ne renvoi pas une chaine hexa vers le port du pic
    forcement puisque tu m'avais dit 3 posts plus tôt que tu veux du binaire ... donc ça envoie du binaire ...

    pour obtenir une chaine ASCII, il faut faire un sprintf() comme j'avais fait au début ... enfin bon ...

    La lecture de quelques cours de C et d'algo me semble indiqué !
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  14. #42
    Seb.26

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    nb: y'a des trucs que je capte pas...

    pourquoi faire un strtoul en base 16 ??? si la chaine ascii représente un nombre écrit en hexa, y'a rien à convertir puisque tu veux sur ton UART une chaine en hexa ???

    si la textbox représente un nombre en décimal, alors c'est en base 10 qu'il faut l'interpréter ...



    essaye :

    Code:
    if( argv[2][0] )
    {
      unsigned long value = strtoul(argv[2],NULL,10);
      char value_str[12];
    
      sprintf(value_str, "%X\r\n", value );
    
      value=0;
      while( value_str[value] )
      {
        while(BusyUART());
        WriteUART(value_str[value++]);
      }
    }
    Dernière modification par Seb.26 ; 31/03/2009 à 23h29.
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. Publicité
  16. #43
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Code:
      sprintf(value_str, "%X\r\n", value );
    me donne Warning [2066] type qualifier mismatch in assignment

  17. #44
    lil-vince

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Salut,

    Vérifies la déclaration de "value"...

    J´aurais une petite question:

    Ou (comment) remplis tu ta textbox?
    Parce que ça pourait grandement simplifier tout ça si tu la remplaçais directement par un nombre si c´est possible.

    Sinon, je doit avoir un problème parce que perso, y a encore des choses qui me frappent alors que vous vous comprenez:
    Citation Envoyé par Seb.26
    La vraie question, c'est : est-ce que tu veux envoyer sur ton port série de l'ASCII ou du binaire ???
    Quand tu envois de l´ASCII par ta liaison série, tu envois quoi?

    Sinon, le code de PASCAL est très bien que cherches-tu en plus?
    Perso je préfère des codes comme ça (sans fonction spéciales), y a moins de surprises.

    On pourrait simplement simplifier un petit peu si tu sais s´il y a que des majuscules ou que des minuscules qui sont entrées dans ta textbox ou en forçant tout en majuscule:

    Code:
    c1 = argv[2][0];
    if (c1 >  96)
       c1 -= 32;
    et pareil pour c2.


    et pourquoi utiliser un "while (c1 != 0)", je pense que l´idée était de traiter une chaine qui pouvait avoir plus de 2 caractères, mais il n´y a pas d´incrémentation de la position des caractères dans la chaine...
    Lá, après le traitement des 2 caractères, on va re-rentrer dans la boucle pour s´arrêter au break car on aura 0<c1<15.
    Sauf si j´ai raté quelque chose, il faudrait le remplacer par un "if (c1 != 0)"
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  18. #45
    lcoulon

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Le code de PA5CAL fonctionne bien et repond parfaitement à mon attente.

    Par contre, vu que pour mon application je ne rentre que 2 caracteres décimaux ( par exemple : 10 ) dans ma textbox l'equivalent en Hexa est renvoyé sur le port série, tout va bien.

    Mais comment réagit son code si plus de 2 caractères decimaux sont entrés ? Par exemple 100 ?
    Qu'est ce qui sera renvoyé surle port série du Pic ?



    Par ailleurs, je voulais aussi tester le code de SEB.26 pour voir si on arriverait au meme résultat que le code proposé par PA5CAL

  19. #46
    lil-vince

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Par contre, vu que pour mon application je ne rentre que 2 caracteres décimaux ( par exemple : 10 ) dans ma textbox l'equivalent en Hexa est renvoyé sur le port série, tout va bien.
    C´est en hexa qu´il faut entrer les nombres dans la textbox avec le code de PASCAL ! Si tu écris 10, il va envoyer 0x10 donc 00010000.

    Sinon, tel quel, le code de PASCAL n´enverra que 1 octet quelle que soit la longueur de ta chaine. Ça n´est pas compliqué, tu suits le soft ligne par ligne, tu vois bien ce que ça fait... Il prend les 2 premiers caractères de ta chaine, décode l´ASCII pour obtenir le nombre correspondant et l´envoi par la liaison série...
    Ta chaine peu faire la taille qu´elle veut, il ne lira que les 2 premiers caractères. Mais tu peux le modifier facilement pour lire toute une chaine en incrémentant ton pointeur sur les caractères...
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  20. #47
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Oups... La dernière instruction de mon code (un break) a sauté. Il faut lire :
    Code:
    char c1, c2;
    
    /* premier chiffre hexa */
    c1 = argv[2][0];
    while (c1 != 0) {
      if (c1>=65 && c1<=70) /* A - F */
        c1 -= 55;
      else
      if (c1>=97 && c1<=102) /* a - f */
        c1 -= 87;
      else
      if (c1>=48 && c1<=57) /* 0 - 9 */
        c1 -= 48;
      else
        break; /* aucun chiffre -> ne rien faire */
    
      /* second chiffre hexa */
      c2 = argv[2][1];
      if (c2>=65 && c2<=70) /* A - F */
        c2 -= 55;
      else
      if (c2>=97 && c2<=102) /* a - f */
        c2 -= 87;
      else
      if (c2>=48 && c2<=57) /* 0 - 9 */
        c2 -= 48;
      else {
        /* cas d'un seul chiffre present */
        c2 = c1;
        c1 = 0;
      }
    
      while( BusyUART() );
      WriteUART( (c1<<4)|c2 );
    
      break;
    }

  21. #48
    PA5CAL

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lil-vince Voir le message
    et pourquoi utiliser un "while (c1 != 0)", je pense que l´idée était de traiter une chaine qui pouvait avoir plus de 2 caractères, mais il n´y a pas d´incrémentation de la position des caractères dans la chaine...
    Lá, après le traitement des 2 caractères, on va re-rentrer dans la boucle pour s´arrêter au break car on aura 0<c1<15.
    Sauf si j´ai raté quelque chose, il faudrait le remplacer par un "if (c1 != 0)"
    Avec la correction, c'est peut-être plus compréhensible ...



    Ici, le « while (c1 != 0) » a été placé à dessein.

    Il permet de n'exécuter l'ensemble de la séquence (jusqu'à l'envoi de l'octet sur l'UART inclus) que si tout se passe bien :
    - si le premier caractère c1 est nul (pas de caractère dans la chaîne), on n'entre pas dans la séquence,
    - si c1 n'est pas un caractère hexadécimal, on quitte la séquence sur un break.
    Si tout va bien, on quitte la boucle while arrivé à la fin de la séquence.

    D'une manière générale, l'utilisation d'une boucle (for, while ou do...while) parcourue une seule fois permet l'exécution d'une séquence d'instructions avec des points de sortie multiples. Ça évite d'effectuer plusieurs fois les mêmes tests, d'ajouter des variables d'état, ou d'utiliser les horribles instructions goto.

    .
    Dernière modification par PA5CAL ; 01/04/2009 à 10h03.

  22. Publicité
  23. #49
    lil-vince

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Avec la correction, c'est peut-être plus compréhensible ...
    Effectivement, je comprend mieux l´utilisation du while
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  24. #50
    Seb.26

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lil-vince Voir le message
    Quand tu envois de l´ASCII par ta liaison série, tu envois quoi?
    100% d'accord avec toi ... ... mais c'est car les choses sont bien claires dans ta tête ... et je pense que tout cela est un peu plus flou pour notre "client"

    Essayer de clarifier un peu ...

    1) Envoyer la chaine ASCII "10" sur le port série envoi : 0x31 0x30 0x00.
    2) Envoyer le nombre (16b) "10" (10 en décimal, soit 0x0A en hexa) en binaire sur le port série donne : 0x00 0x0A.

    Je crois bien que lcoulon veut envoyer comme en (1).

    Si j'ai bon, il veut "décoder" la chaine ASCII argv[2] (un nombre écrit en décimal), pour l'envoyer en ASCII (écrit en HEXA)

    NB: lcoulon, cherche le prototype de sprintf(), il ne faudrait qu'il y ai un truc avec les char[] en rom et en ram ...

    Tu peux aussi remplacer le "%X" par un "%x" ... pour voir ...

    Si ce n'est déjà fait, essaye :
    Code:
    sprintf(value_str, "%X\r\n", 0x0A );
    ... on verra si c'est 'value' qui pose problème ...
    Dernière modification par Seb.26 ; 01/04/2009 à 16h46. Motif: orthographe...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  25. #51
    lil-vince

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par Seb.26
    100% d'accord avec toi ... ... mais c'est car les choses sont bien claires dans ta tête ... et je pense que tout cela est un peu plus flou pour notre "client"

    Essayer de clarifier un peu ...

    1) Envoyer la chaine ASCII "10" sur le port série envoi : 0x31 0x30 0x00.
    C´est pour ça que réponse #4, j´ai essayé d´expliquer...
    Il n´y a que message #26 que j´ai compris ce qu´il voulait!

    Par contre, quand on envoi la chaine de caractère ASCII "10", on envoi seulement 0x31 et 0x30...
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  26. #52
    Seb.26

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lil-vince Voir le message
    Par contre, quand on envoi la chaine de caractère ASCII "10", on envoi seulement 0x31 et 0x30...
    Tout dépend comment on le fait, mais en C, une chaine ASCII se termine toujours par un 0x00 ... mais on peut en effet ne pas l'envoyer ...

    en tout cas, c'est sûr que le sujet n'est pas limpide ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  27. #53
    lil-vince

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Il faut l´envoyer des fois?
    Perso je ne l´ai jamais envoyé, pour moi, c´est juste un caractère qui permet au programme de savoir que c´est la fin de la chaine (et que justement il faut arrêter d´envoyer), en général on envoi plutôt un \n ou \r pour le même effet en transmission.
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  28. #54
    Seb.26

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Citation Envoyé par lil-vince Voir le message
    Il faut l´envoyer des fois?
    Perso je ne l´ai jamais envoyé, pour moi, c´est juste un caractère qui permet au programme de savoir que c´est la fin de la chaine (et que justement il faut arrêter d´envoyer), en général on envoi plutôt un \n ou \r pour le même effet en transmission.
    Tout dépend ce ce que tu veux faire ...
    par exemple si tu veux envoyer des textes en ASCII pour les afficher centrés sur un LCD 4 lignes, le 0x00 te permet d'envoyer les \r\n pour passer à la ligne ...

    mais on pourrait aussi encapsuler les textes dans des trames en indiquant la longueur de la trame, ou encore utiliser le 0x00 comme marqueur de fin de trame ...

    << chacun-fait...fait-fait ... s'qui lui plait...plait-plait >>

    Mais bon, revenons au problème de lcoulon ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  29. Publicité
  30. #55
    decouvreur00

    Re : Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa

    Bonjour a tous,

    je suis a la recherche de la façon de convertir ce code : format: ASCII

    baa2f82c450d9c7f4a13305b645753 fd

    en format "PIC" HEX car le résultat est le suivant :

    0008: 3401 346D 3427 3400 3420 34C4 34FE 3474
    0010: 346C 3413 3423 3403 0782 3495 34EA 3493

    merci

Page 2 sur 2 PremièrePremière 2

Discussions similaires

  1. Programmation PIC Assembleur ou C pour projet ambitieux
    Par nekcorp dans le forum Électronique
    Réponses: 26
    Dernier message: 05/01/2010, 20h19
  2. PIC 12C(F)509 et hexa
    Par mortaurat dans le forum Électronique
    Réponses: 2
    Dernier message: 20/12/2008, 21h02
  3. Quel langage pour la programmation des PIC
    Par gaga2410 dans le forum Électronique
    Réponses: 39
    Dernier message: 22/09/2007, 10h41
  4. programmation d'une tangente pour pic
    Par KHEOPS1982 dans le forum Électronique
    Réponses: 0
    Dernier message: 29/10/2005, 10h55
  5. Conversion hexa en BCD sur PIC
    Par ioio59 dans le forum Électronique
    Réponses: 2
    Dernier message: 14/04/2004, 09h17
Découvrez nos comparatifs produits sur l'informatique et les technologies.