Parser un string

Bonjour à tous,

J’ai un petit souçi avec mon code.
Je reçoit sur ma carte arduino mega 2560 une chaine de caractère du style: 500;200;10;200;60
Il me faut parser cette chaine et stocker chaque valeur dans une variable. Cela correspond beaucoup a récupérer des données GPS (et oui j’ai parcouru le forum ;D ).
sauf que je n’arrive pas a stocker ces données dans un tableau, le compilateur me sort: invalid conversion from ‘char**’ to ‘char’.
Si quelqu’un peut m’aider à trouver une solution
Merci à vous et bonne journée.

#include <string.h>
char sz = “3500;270;890;70;4/”;

void setup()
{
Serial.begin(9600);

char *p = sz;
char *str;
char tab[10];
int i=0;
int j;

while(p != “/”)
{
str = strtok_r(p, “;”, &p);
tab*=&str;*

  • i=i+1;*
  • }*
    for (j=0; j<i; j++)
  • {*
  • Serial.println(tab[j]);*
  • }*
    }
    void loop()
  • {*
  • delay(1000);*
  • Serial.print(“ok”);*
  • }*
    _1.ino (347 Bytes)

Lors du premier appel le premier argument doit être la chaîne à analyser. Lors des appels suivants cet argument doit être NULL.

Le 3ème argument de strtok-r devrait être un pointeur de char différent de la chaîne à analyser car il est utilisé en interne de la fonction pour gérer les appel successifs.

La fonction retourne un pointeur de chaine donc il faut faire une copie de cette chaîne dans ton tableau sinon tu perds les valeurs extraites. tab devrait être un tableau de pointeurs de chaîne.

Un peu de lecture: La page de strtok_r

J’ai revu un peu la structure, je ne suis pas loin du résultat recherché mais je n’arrive toujours pas a remplir les données dans un tableau:

#include <stdio.h>
#include <string.h>
char *a;
int i=0;
char *tab[100];

void setup()
{
Serial.begin(9600);

char str = “500,200,450”;
char * pch;
pch = strtok (str,",");
while (pch != NULL)
{

Serial.print(pch);
Serial.print("\n");
delay(500);
pch = strtok (NULL, “,”);
i=i+1;
strcpy(tab*, pch);*

  • }*
    }
    void loop()
    {
  • for (i=0; i<3 ;i++)*
  • {*
    _ Serial.print(tab*);_
    _
    delay(500);_
    _
    i++; _
    _
    }_
    _
    }*_

Bonjour,

Voici un exemple: http://codepad.org/bTOqiD38

Code entre balises

Sinon il n’y a pas d’allocation mémoire, et je comprend comment des codes comme celui de guix peuvent fonctionner. Un qui devrait marcher sans problème :

int i=0;
char tab[5][5];

void setup()
{
Serial.begin(9600);

char str[] = "500,200,450";
 char * pch;
 pch = strtok (str,",");
 while (pch != NULL)
 {

   Serial.print(pch);
   Serial.print("\n");
   delay(50);
   pch = strtok (NULL, ",");
   strcpy(tab[i++], pch);

 }
}

void loop() 
{

 for (i=0; i<3 ;i++)
 {
   Serial.print(tab[i]);
   delay(500);
 }
}

Il serait bien aimable et bienvenu de lire ou relire la charte ainsi que de consulter le sujet sur la façon d'écrire les messages, ces deux éléments se trouvent en tête des messages du forum.

Ensuite, fort de ces nouvelles informations, il serait judicieux que vous éditiez, au moyen du bouton dédié à cet effet dans la fenêtre de rédaction de sujet, les messages contenant du code afin d'insérer les dits codes entre les balises idoïnes.

Merci pour votre infinie bienveillance.

void setup() 
{
int v1;
int v2;
int v3;
 char str[100];
char separateurs[]=";";
int MAX_WORDS = 20;
char *words[MAX_WORDS];
int wordsCount=0;
char * p = strtok(str, separateurs);
int k=0;
  
  Serial.begin(9600);        //Initialisation de la vitesse de com

          while(SerialOK==0)    
          { 
              if (Serial.available() > 0)   
              {
                  delay(100);
                for(i=0;i<50;i++)
                str[i] = NULL;
                  i=0;
                 while(Serial.available() > 0) 
                       {                       
                       str[i++] = Serial.read();      //lecture de la saisie
                       }
                  
                 SerialOK=1;
               }
            }
               
          SerialOK=0; //Reinitialisation de la verification de la saisie clavier



 while (p != NULL && wordsCount < MAX_WORDS )
  {
    words[wordsCount++] = p;
    p = strtok( NULL, separateurs );
  }



  chauffe=atof(words[0]);
      Serial.print("\n");
      Serial.print("Variable1:");
      Serial.print(v1);
  chauffe_high=atof(words[1]);
        Serial.print("\n");
      Serial.print("Variable2:");
      Serial.print(v2);
  chauffe_low=atof(words[2]);
        Serial.print("\n");
      Serial.print("Variable3:");
      Serial.print(v3);
}

void loop()
{
}

Le code fournit par Guix fonctionne admirablement bien.
Par contre je souhaite pouvoir saisir moi même la chaine par l’interface. Or lorsque j’intègre le code de guix dans le mien, cela ne fonctionne pas. Pourtant lorsque je saisi 10;20;30 et que j’affiche Serial.print(str) je lis bien 10;20;30 mais la découpe ne fonctionne par.
v1=10 v2=0 v3=0??? Je pense que cela peut venir des conditions de la boucle mais je n’arrive pas à trouver.

Jean-François: Il serait bien aimable et bienvenu de lire ou relire la charte ainsi que de consulter le sujet sur la façon d'écrire les messages, ces deux éléments se trouvent en tête des messages du forum.

Ensuite, fort de ces nouvelles informations, il serait judicieux que vous éditiez, au moyen du bouton dédié à cet effet dans la fenêtre de rédaction de sujet, les messages contenant du code afin d'insérer les dits codes entre les balises idoïnes.

Merci pour votre infinie bienveillance.

Hemmm !!!

thomles:
Le code fournit par Guix fonctionne admirablement bien.
Par contre je souhaite pouvoir saisir moi même la chaine par l’interface. Or lorsque j’intègre le code de guix dans le mien, cela ne fonctionne pas. Pourtant lorsque je saisi 10;20;30 et que j’affiche Serial.print(str) je lis bien 10;20;30 mais la découpe ne fonctionne par.
v1=10 v2=0 v3=0??? Je pense que cela peut venir des conditions de la boucle mais je n’arrive pas à trouver.

Il fonctionne admirablement bien jusqu’à ce qu’il ne marche plus … Voir mon message plus haut et essaye mon code

int i=0;

char tab[10][10];
byte SerialOK;
int a;
int b;

void setup()
{
Serial.begin(9600);

char str[100];
char * pch;
pch = strtok (str,",");

//Fonction permettant la lecture de la valeur consigne de la température de chauffe dela resistance du vase d’expansion//
            Serial.print(“saisir temperature”);
          while(SerialOK==0)   
          {
              if (Serial.available() > 0) 
              {
                  delay(100);
                for(i=0;i<50;i++)
                str[i] = NULL;
                  i=0;
                while(Serial.available() > 0)
                      {                     
                      str[i++] = Serial.read();      //lecture de la saisie
                      }
                 
                SerialOK=1;
              }
            }
             
          SerialOK=0; //Reinitialisation de la verification de la saisie clavier

while (pch != NULL)
  {
    Serial.print(str);
    Serial.print("\n");
    delay(100);
    pch = strtok (NULL, “,”);
    strcpy(tab[i++], pch);
  }
 
a=atof(tab[0]);
b=atof(tab[1]);

Serial.print(a);
    Serial.print("\n");
    Serial.print(b);
    Serial.print("\n");

}

Merci B@tto, ton code fonctionne aussi mais j’ai le même problème, lorsque le str est saisie au clavier, je veux stocker dans une variable avec atof mais cela ne fonctionne pas. J’ai en sortie 0 :confused:
Aurais-tu une de tes idées miraculeuses?

Jen François, est ce que l’édition du message est ok maintenant?

Les messages 0 et #1 sont à éditer les codes sont hors balises.

teste ça

int v1;
int v2;
int v3;
 char str[100];
 //char str[]="111;222,333:444;";
char separateurs[] = " ,.;:!?";
const unsigned int MAX_WORDS = 20;
char *words[MAX_WORDS];
int wordsCount=0;
int k=0;
int SerialOK = 0;
void setup() 
{
  Serial.begin(9600);        //Initialisation de la vitesse de com
}

void loop()
{
          while(SerialOK==0)    
          { 
              if (Serial.available() > 0)   
              {
                  delay(100);
                for(int i=0;i<100;i++)
                {
                str[i] = NULL;
                }
               signed int rang=0;
                 while(Serial.available() > 0) 
                       {                       
                       str[rang++] = Serial.read();      //lecture de la saisie
                       }
                 SerialOK =1;
                 }
               }
          SerialOK=0; //Reinitialisation de la verification de la saisie clavier

char * p = strtok(str, separateurs);
 while (p != NULL && wordsCount < MAX_WORDS )
  {
    words[wordsCount++] = p;
    p = strtok( NULL, separateurs );
  }
for ( unsigned int i = 0; i < wordsCount; i++ )
  {
Serial.println(  words[ i ] );
  }
      Serial.print("Variable1:");
      Serial.println(words[0]);
  
      Serial.print("Variable2:");
      Serial.println(words[1]);
  
      Serial.print("Variable3:");
      Serial.println(words[2]);
      while(1);
}

thomles: Merci B@tto, ton code fonctionne aussi mais j'ai le même problème, lorsque le str est saisie au clavier, je veux stocker dans une variable avec atof mais cela ne fonctionne pas. J'ai en sortie 0 :confused: Aurais-tu une de tes idées miraculeuses?

Tu ne remets pas i à 0 avant ta routine de parsage

as tu testé le code que je t'ai posté ?

Désolé de répondre à un vieux post mais:

B@tto: Il fonctionne admirablement bien jusqu'à ce qu'il ne marche plus ...

Peux-tu expliquer dans quel cas mon code cesserait de fonctionner ?

Je consomme pas de drogue mais j'avais du voir des choses qui n'existait parce que la en effet je vois pas trop ce que je voulais dire et y'a rien qui me choque la xD