Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

decoder un message en C18



  1. #1
    MorpheusPic

    decoder un message en C18


    ------

    salut

    je debute en C18 donc je me retrouve tres vite coincer ...

    ce que je veut faire ....

    je veut pouvoit decoder une chaine de commandes envoyee par radio du style MODE=1,SENS=151,TIME=10.

    le nombres de parametres passes par radio peuvent changer
    ex envoyer seulement MODE=0.

    je pense utiliser un point pour detecter la fin du message et la virgule comme separateur.


    ce que jais essayer ...

    rechercher la position du string strn2 dans la trame recu strn bon sa sa marche

    dans pch jais la position de mon M de MODE ?,c'est la que je sais plu trop ...

    ensuite je tente de convertir la valeur ascci du 1 en decimal
    donc je pointe normalement a la fin de 'MODE=' avec [pch+5] ?

    mais mplab me dit a la ligne "Mode = atob(strn[pch+5]);" [1129] [] operator requires a pointer and an integer as operands


    Code:
    	
    
    	char strn[30];
    	char strn2[30];
    	char * pch;
    
    
    sprintf(strn2,"MODE=");
    pch = strstr(strn,strn2);
        if(pch)			  
        {
        Mode = atob(strn[pch+5]);
        }

    voila si quelqun sait comment faire sa je le remerci d'avance

    -----

  2. Publicité
  3. #2
    Seb.26

    Re : decoder un message en C18

    Teste :
    Code:
    char strn[30];
    char strn2[30];
    char * pch;
    
    sprintf(strn2,"MODE=");
    pch = strstr(strn,strn2);
    if(pch)			  
    {
        Mode = atob( pch+5 );
    }
    Tu dois aussi pouvoir faire : << Mode = pch[5] - '0'; >>
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  4. #3
    MorpheusPic

    Re : decoder un message en C18

    oups je vien de voir que je me suis tromper en recopiant ...

    c'est pas Mode = atob( pch+5 ); mais Mode = atob(strn[pch+5]); qui pose probleme.

    dsl et merci de ton aide

  5. #4
    Seb.26

    Re : decoder un message en C18

    ça change rien ...

    La fonction 'strstr' te renvoie un pointeur vers occurrence cherchée, il te suffit alors d'aller chercher la valeur dans ce pointeur.

    NB: l'astuce du << Mode = pch[5] - '0'; >> n'est OK que si le MODE est sur 1 char et en décimal ! ( 0 à 9 ) ...

    PS: c'est quoi 'atob' ??? ( un genre de atoi pour un byte ? ) ... c'est pas ansi ça ?! ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  6. A voir en vidéo sur Futura
  7. #5
    MorpheusPic

    Re : decoder un message en C18

    oublie mon dernier message javait pas fait attention

    je vais tester l'astuce que tu ma donner ,jais pas bien compri le - '0' ?

    ben jais choisi atob car mode pourais aller de 0 a 255

    est ce plus addapter atoi ?

    sinon que contien normalement pch apres le strstr ?le 0 ,le M , le = ???

  8. #6
    MorpheusPic

    Re : decoder un message en C18

    bon je vien de tester et sa marche bien ,pour tester je renvoi la letre qui se trouve apres MODE= et je retrouve bien mon 0 ou 1 ascci

    par contre la conversion ascci decimal a pas lair de marcher ...

    Code:
    										Mode = atoi(*(pch+5));
    		MiApp_FlushTx();
    		MiApp_WriteData(*(pch+5));
    		MiApp_UnicastAddress(DestAddress,TRUE,FALSE);
    je veut pourvoir passer des parametre sur un octet voir 2 non signés

    ex: SENS=255 dans la trame recu et la decoder et avoir mes 255 dans mon octet SENS en decimal

  9. Publicité
  10. #7
    MorpheusPic

    Re : decoder un message en C18

    voila la version qui marche cepandant je pense quon peut l'ammeliorer

    Code:
    sprintf(strn2,"MODE=");
    	pch = strstr(strn,strn2);
    		if (pch)
    		{	
    			for(i = 0; i < 5; i++)
    			{
    			strn[i] = pch[i+5];
    			}
    		Mode = atoi(strn);
    
    		MiApp_FlushTx();
    		MiApp_WriteData(*(pch+5));
    		MiApp_UnicastAddress(DestAddress,TRUE,FALSE);
    		}
    aussi est ce que je peut pas plutot faire un truc du genre pch = strstr(strn,"MODE="); au lieu de charger "MODE=" dans strn2 avec sprintf et faire pch = strstr(strn,strn2); ?

    peut on aussi charger une chaine de carracteres dans un string sans sprintf ,du genre strn2 = "salut"?

    merci de ton aide en tout cas

  11. #8
    Seb.26

    Re : decoder un message en C18

    NB: purée que t'es dur à lire ...

    En vrac :

    aussi est ce que je peut pas plutot faire un truc du genre pch = strstr(strn,"MODE="); au lieu de charger "MODE=" dans strn2 avec sprintf et faire pch = strstr(strn,strn2); ?
    ça t’aurait pris moins de temps de tester que de poser la question ...
    la ref de strstr() : http://www.cplusplus.com/reference/c...string/strstr/

    ( je vais pas tout te mâcher non plus ... )

    je vais tester l'astuce que tu ma donner ,jais pas bien compri le - '0' ?
    OK ... en gros, si tu as un char ASCII en décimal, ça va de '0' à '9' (regarde une table ASCII).
    Donc ce que tu veux, c'est convertir le char ASCII '0' en valeur 0 sur un byte ... cela revient à soustraire la valeur ASCII du '0' ...

    Et c'est bien plus rapide/économique que les fonctions C style 'atoi' et 'atob' ... par contre, cela ne fonctionne que si tu as ta valeur sur 1 seul digit, sinon il faut faire plus évolué ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  12. #9
    Seb.26

    Re : decoder un message en C18

    Essaye ça :
    Code:
    pch = strstr(strn,"MODE=");
    if (pch)
    {	
        Mode = atoi(pch+5);
    ...
    la fonction atoi va s’arrêter toute seule si elle ne trouve plus de chiffres : http://www.cplusplus.com/reference/c.../cstdlib/atoi/
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  13. #10
    MorpheusPic

    Re : decoder un message en C18

    ben en fait javais du mal essayer pour le pch = strstr(strn,"MODE="); car il me sorter une erreur ...

    je t'embete une derniere foi

    je veut detecter la presence du '=' dans ma string donc je fait :

    if (pch[4] == "=")

    ou meme

    if (pch[4] == "?")

    et la mplab me dit :Error [1128] compatible scalar operands required
    peut etre que justement il interprete le = comme un operateur ?

    je pense que le reste va aller merci pour ton aide en tout cas

  14. #11
    sdec25

    Re : decoder un message en C18

    Bonjour,
    Une chaîne ("=") est de type char* (pointeur). L'instruction if (pch[4] == "=") revient donc à comparer un caractère à un pointeur ce qui n'est pas permis.
    Un caractère doit être mis entre quote ('=').

  15. #12
    MorpheusPic

    Re : decoder un message en C18

    ha ok ^^ merci javais du mal a voir la difference entre "" et ''

    aussi quand je fait pch = strstr(strn,"MODE=") je n'est aucune erreur de comilation mais sa marche pas ,il y a pas "MODE=" en 2 eme parametre

    donc si je fait pch = strstr(strn,'MODE=') sa marcherais mieux ?

    merci

  16. Publicité
  17. #13
    sdec25

    Re : decoder un message en C18

    Citation Envoyé par MorpheusPic Voir le message
    donc si je fait pch = strstr(strn,'MODE=') sa marcherais mieux ?
    non, strstr prend un char* en paramètre donc il faut une chaîne entre guillemets.
    Voir un tuto sur les chaînes de caractères en C : http://www.siteduzero.com/tutoriel-3...aracteres.html
    Entre quotes il ne peut y avoir qu'un seul caractère :
    '=' est un caractère, c'est à dire la valeur numérique du caractère = dans la table ASCII soit 61 (sur 1 octet)
    'MODE=' n'a pas de sens et est interdit
    "MODE=" est une pointeur vers un tableau de 5 caractères + le 0 final.

    aussi quand je fait pch = strstr(strn,"MODE=") je n'est aucune erreur de comilation mais sa marche pas ,il y a pas "MODE=" en 2 eme parametre
    Ça vient de l'architecture des PIC. Fais une recherche dans le forum avec les mots-clés "const rom" et "architecture harvard" tu trouveras des explications.
    En gros un PIC fait la différence entre une variable allouée en RAM (ram char* ou simplement char*) et la même valeur dans la mémoire du programme (const rom char*, par exemple "MODE=").
    Dans ton cas, strstr attend un ram char* et tu lui passes une chaîne constante définie dans ton code source (de type const rom char*), du coup strstr ne trouve pas ta chaîne "MODE=".
    Pour contourner ce problème, dans les lib C18 toutes les fonctions sont définies en plusieurs versions. Par exemple strstr, strstrpgm, strstrpgmram et strstrrampgm.
    A toi de choisir celle qui convient à ton programme.

Discussions similaires

  1. décoder message chiffré
    Par ghost5200 dans le forum Science ludique : la science en s'amusant
    Réponses: 16
    Dernier message: 04/12/2019, 12h23
  2. Décoder message chiffré...
    Par moxinette dans le forum Science ludique : la science en s'amusant
    Réponses: 18
    Dernier message: 13/03/2011, 20h37
  3. Réponses: 2
    Dernier message: 23/02/2011, 13h47
  4. 1-of-2 decoder/demultiplexer
    Par marco05 dans le forum Électronique
    Réponses: 1
    Dernier message: 24/05/2010, 21h11
  5. Réponses: 1
    Dernier message: 02/11/2008, 14h06
Découvrez nos comparatifs produits sur l'informatique et les technologies.