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 :

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


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut Programmation en C pour Pic : Transformer de l'ASCII decimal en Hexa
    Bonjour


    J'essaie d'utiliser la pile Ethernet Microchip, et la petite partie de code ci-dessous me permet d'envoyer, depuis une textbox ( boite de texte ) située sur ma page Web, son contenu vers le port serie du Pic (usart )



    est en fait le contenu du texte qui sera écrit dans la texbox.

    Donc si je tape "Bonjour" dans la textbox puis que je clique sur le bouton 'Envoyer' alors sous hyperterminal je pourrai ce message s'écrire.


    Pour en venir à mon but final, le texte entré dans la textbox est au format ASCII, je voudrai modifier le code ci-dessous pour que :

    - le contenu qui puisse être entré dans la textbox soit limité à une longueur de 3 caractères

    - et que ceux ci soient envoyées au format HEXA.


    Par exemple, je rentre '100' dans la boite de texte, alors ce sera '64' ( hexa ) qui sera envoyé sur l'usart du Pic.


    si je rentre '10' alors se fera 'F' qui sera envoyé ...

    Pourriez vous me dire ce qu'il faut modifier pour arriver à cela ?

    Merci beaucoup,


    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
     
    case CGI_CMD_SERIAL:    // ACTION=6
     
     
     
           if(strlen(argv[2])!=0){
               for(var=0;var<strlen(argv[2]);var++){  
     
                   while(BusyUART());
                   WriteUART(argv[2][var]);
     
               }
           while(BusyUART());
           WriteUART('\r');
           while(BusyUART());
           WriteUART('\n');
          }
     
           memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
           break;

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Par exemple, je rentre '100' dans la boite de texte, alors ce sera '64' ( hexa ) qui sera envoyé sur l'usart du Pic.
    Pouriez-vous jeter un oeil sur sscanf ?

    Est-ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(BufferAsciiEnEntree,"%d",&IntegerEnSortie)
    pourrez convenir à votre besoin ?

    J'insiste sur le &

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci de votre aide,

    Je n'arrive pas à inclure votre ligne de code dans ma partie de programme,

    Pourriez vous me dire ou et comment l'intégrer ?

    sur le principe suivant ça ne fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            if(strlen(argv[2])!=0){
            	for(var=0;var<strlen(argv[2]);var++){  
     
    				while(BusyUART());
    				sscanf(argv[2][var],"%d",&IntegerEnSortie)
            		WriteUART(IntegerEnSortie);
     
    			}
    J'ai remplacé "BufferAsciiEnEntree" par argv[2][var] qui logiquement doit correspondre à la chaine de caractères entrés dans la texbox, mais pour IntegrerEnSortie je bloque ...

    Pouvez vous m'aider ?

  4. #4
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Comment se comporte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    printf(argv[2]);
    sscanf(argv[2],"%d",&IntegerEnSortie);
    printf("%x", IntegerEnSortie);
    WriteUART((unsigned char)IntegerEnSortie);
    Vérifier si la chaîne est argv[2] ou &argv[2]

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Avec les lignes que vous me proposez j'obtiens ces erreurs lors de la compilation :

    1191:Error [1105] symbol 'IntegerEnSortie' has not been defined
    1191:Error [1101] lvalue required
    1191:Warning [2058] call of function without prototype
    1192:Error [1105] symbol 'IntegerEnSortie' has not been defined
    1193:Error [1105] symbol 'IntegerEnSortie' has not been defined


    en sachant que la ligne 1191 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(argv[2],"%d",&IntegerEnSortie);
    ligne 1192 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%x", IntegerEnSortie);
    ligne 1193 est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteUART((unsigned char)IntegerEnSortie);

    Merci pour votre aide,

  6. #6
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // Include de sscanf
    #include <stdio.h>
     
    // Déclaration d'une variable en langage C
    unsigned int IntegerEnSortie;
     
    printf(argv[2]);
    sscanf(argv[2],"%d",&IntegerEnSortie);
    printf("%x", IntegerEnSortie);
    WriteUART((unsigned char)IntegerEnSortie);

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    J'ai intégré le fichier stdio.h qui est présent avec les librairies de mon compilateur MCC18 de Microchip .


    A présent avec les lignes que vous m'avez proposé plus haut, il reste malgré tout cette erreur lors de la compilation :

    1195:Warning [2058] call of function without prototype

    c'est cette ligne qui pose pb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sscanf(argv[2],"%d",&IntegerEnSortie);
    Je me demande si sscanf est bien pris en charge par mon fichier stdio.h ( ci-dessous)

    Code stdio.h : 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
    #ifndef __STDIO_H
    #define __STDIO_H
     
    #include <stdarg.h>
    #include <stddef.h>
     
    /* Change this to near (or omit altogether) if building small memory model
     * versions of the libraries
     */
    #define MEM_MODEL far
     
    #define EOF ((int)-1)
     
     
    typedef unsigned char FILE;
     
    /* output destination handles */
    #define _H_USER ((FILE*)((int)-1))
    #define _H_USART ((FILE*)((int)-2))
     
    extern FILE *stderr;
    extern FILE *stdout;
     
     
    int putc (auto char c, auto FILE *f);
    int vsprintf (auto char *buf, auto const MEM_MODEL rom char *fmt, auto va_list ap);
    int vprintf (auto const MEM_MODEL rom char *fmt, auto va_list ap);
    int sprintf (auto char *buf, auto const MEM_MODEL rom char *fmt, ...);
    int printf (auto const MEM_MODEL rom char *fmt, ...);
    int fprintf (auto FILE *f, auto const MEM_MODEL rom char *fmt, ...);
    int vfprintf (auto FILE *f, auto const MEM_MODEL rom char *fmt, auto va_list ap);
    int puts (auto const MEM_MODEL rom char *s);
    int fputs (auto const MEM_MODEL rom char *s, auto FILE *f);
     
    #endif


    Merci à vous,

  8. #8
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Ce n'est pas normal.

    Quel est le répertoire de ce fichier ?

    Est-ce que vous pouvez essayer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdlib.h>
     
    int atoi(const char *nptr);

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    stdio.h est dans le répertoire include du projet, MPLAB le détecte bien car je retire MPLAB me met une erreur indiquant que le fichier est introuvable.

    Cependant, j'obtiens bien cette erreur avec le code suivant :


    1197:Warning [2058] call of function without prototype


    Error - could not find definition of symbol 'sscanf' in file '..\src\obj\main.o'

    il semblerait que sscanf ne soit pas géré par stdio.h ...

    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
     
        case CGI_CMD_SERIAL:	// ACTION=6
     
     
     
            if(strlen(argv[2])!=0){
            	for(var=0;var<strlen(argv[2]);var++){  
     
    				//while(BusyUART());
    				//WriteUART(argv[2][var]);
     
    // Include de sscanf
    #include <stdio.h>
     
    // Déclaration d'une variable en langage C
    unsigned int IntegerEnSortie;
     
    printf(argv[2]);
    sscanf(argv[2],"%d",&IntegerEnSortie);
    printf("%x", IntegerEnSortie);
    WriteUART((unsigned char)IntegerEnSortie);
     
     
    		}
            while(BusyUART());
            WriteUART('\r');
            while(BusyUART());
            WriteUART('\n');
           }

    Sinon, avec votre autre proposition j'ai également une autre erreur de compil : ( stlib.h a été ajouté au projet )

    1193:Error [1109] type mismatch in redeclaration of 'atoi'


    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
        case CGI_CMD_SERIAL:	// ACTION=6
     
     
     
            if(strlen(argv[2])!=0){
            	for(var=0;var<strlen(argv[2]);var++){  
     
    				//while(BusyUART());
    				//WriteUART(argv[2][var]);
     
     
    #include <stdlib.h> 
     
    int atoi(const char *nptr); 
     
     
    		}
            while(BusyUART());
            WriteUART('\r');
            while(BusyUART());
            WriteUART('\n');
           }
     
    		memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
            break;

    Je pense que la première idée est bonne mais je "sscanf" ne semble pas être reconnu

    Merci a vous,

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    J'ai l'impression que tu fais du logiciel embarqué. De mémoire, quand j'en avais fait, la librairie C que j'avais était très fortement restreinte, c'est à dire que toutes les fonctions n'existaient pas.

    Quand je vois ton stdio.h, je me dis que c'est peut être aussi ton cas.

    Dans ce cas, il faudra te contenter de ce que tu as

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Oui en effet, cette partie de programme gère en fait une boite de texte présente dans une page web, les infos contenues dans celle-ci est ensuite reçue par un Pic Microchip via un contrôleur Ethernet.

    Mon était de taper des données ASCII ou décimales dans cette boite de dialogue et que le Pic reçoive la correspondance de ce qui est tapé mais en HEXA.

    Ne pourrait-on pas transformer la donnée ASCII de la textbox en Hexa sans passer par une bibliothèque ?

  12. #12
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Avez vous essayé atoi() via stdlib ?

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    oui, avec atoi j'obtiens cela :

    1193:Error [1109] type mismatch in redeclaration of 'atoi'

    Voulez vous je poste l'intégralité de mon programme ?

  14. #14
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Oui, je veux bien. Par contre, il faut supprimer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int atoi(const char *nptr);
    la déclaration est déjà faite dans stdlib.
    Il suffit juste d'appeler la fonction.

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    voici mon code ( main.c )

    la partie du code concerné se trouve à partir de la ligne 1176.

    Merci à vous,
    Fichiers attachés Fichiers attachés

  16. #16
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Mais, il y a déjà atoi() d'utilisé:

    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
    BOOL StringToIPAddress(char *str, IP_ADDR *buffer)
    {
        BYTE v, byteIndex = 0;
        char *temp;
     
        temp = str;
     
        while( v = *str )
        {
            if ( v == '.' )
            {
                *str++ = '\0';
                buffer->v[byteIndex++] = atoi(temp);
                temp = str;
            }
            else if ( v < '0' || v > '9' )
                return FALSE;
     
            str++;
        }
     
        buffer->v[byteIndex] = atoi(temp);
     
        return (byteIndex == 3);
    }
    Est-ce que c'est vous qui l'avez ajouté pour votre besoin ?
    Sinon il n'y a qu'a appeler cette fonction...

  17. #17
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Ce n'est pas moi qui créé ce code ( je suis trop débutant pour cela )

    Je sais que la fonction atoi() déja présente dans le code permet la lecture et le formatage d'une donnée issue d'un capteur de température.

    En ce qui concerne l'intégration de atoi() dans ma partie de code gérant la textebox, je suis un peu perdu . . .

    Pourriez vous m'indiquer comment l'intégrer svp ?

    Je vous remercie,

  18. #18
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Notre ami google indique
    int atoi(const char *s) convertit l'argument s en un int,
    Il faut faire un ptit effort...

  19. #19
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    J'ai peur de ne pas trop comprendre le fonctionnement ( j'ai pourtant regardé des exemples avec google )

    Ceci est-il correct ?

    je ne sais pas si c'est var ou argv[2] qui doit être placé dans int atoi( ... )



    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
      case CGI_CMD_SERIAL:	// ACTION=6
     
     #include <stdlib.h> 
     
            if(strlen(argv[2])!=0){
            	for(var=0;var<strlen(argv[2]);var++){  
     
             int atoi(const char *var); 
     
      				while(BusyUART());
    				WriteUART(argv[2][var]);
     
    		}
            while(BusyUART());
            WriteUART('\r');
            while(BusyUART());
            WriteUART('\n');
           }
     
    		memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
            break;

  20. #20
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    861
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 861
    Points : 715
    Points
    715
    Par défaut
    Essayer cela:
    (pas de stdlib.h ni de prédéclaration de la fonction).

    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
    case CGI_CMD_SERIAL:	// ACTION=6
     
            if(strlen(argv[2])!=0){
            	for(var=0;var<strlen(argv[2]);var++){  
     
      				while(BusyUART());
    				WriteUART((char)atoi(argv[2]));
     
    		}
            while(BusyUART());
            WriteUART('\r');
            while(BusyUART());
            WriteUART('\n');
           }
     
    		memcpypgm2ram((void*)argv[0], (ROM void*)COMMANDS_OK_PAGE, COMMANDS_OK_PAGE_LEN);
            break;

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/04/2013, 12h08
  2. Réponses: 21
    Dernier message: 14/04/2009, 23h01
  3. Réponses: 0
    Dernier message: 30/03/2009, 23h46
  4. programme en C pour PIC
    Par danbike19 dans le forum C
    Réponses: 1
    Dernier message: 14/11/2007, 11h34
  5. [pic 16f84] programmation en c pour RS 232
    Par nojnoj dans le forum C
    Réponses: 2
    Dernier message: 19/03/2007, 11h55

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