faire des tests, remplir des variables de différents types depuis Serial

Bonjour,

J'ai un très gros problème ! J'avoue, j'ai essayé une centaines d'essais avant de revenir vers vous :cry:

Voilà ce qui se passe.

J'envoie des données depuis la console via Serial. Exemple pwm:0 ou pwm:1.
Les données arrivent bien.
Je parse dans un tableau et j'ai bien mes deux entitées parsés.

Mais les choses se gâtent ici !

Faire un test sur "pwm" ok, ça fonctionne.
Faire un test sur "0"ou "1", comme '0' ou '1', 0 ou 1 NOK, ça ne fonctionne pas.
Charger une string avec 0 ou 1 depuis le tableau fonctionne.
Charger un boolean avec 0 ou 1 depuis le tableau ne fonctionne pas.

Comme je sais qu'un code vaut mieux qu'un long discours et que 10 cours valent pas toujours autant qu'une conversation, autant poser un peu de code et voir comment ça peut se bidouiller :slight_smile:

Pour faire simple, je ne détaille qu'une partie du code, sinon, j'en ai pour des heures d'explications et c'est pas le but du sujet.

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);         //Comunication série
}

void loop() {
  // put your main code here, to run repeatedly:

  if(stringComplete) {
    //Serial.println(cmds[0]);
    //Serial.println(cmds[1]);

    if(strcmp(cmds[0], "pwm") == 0)
    {
      String test = "";
      test = cmds[1];
      flag = test;
      Serial.println(cmds[1]);
      Serial.println(test);
    }
    stringComplete = false;
  }
}

void serialEvent()
{
  int i=0;
  
  memset(buffer, 0, 50);

  if(Serial.available() > 0)
  {
    while(Serial.available() > 0)
    {
      buffer[i] = Serial.read();
      delay(3);
      i++;
    }

    cmds[0] = strtok_r(buffer, ":", &ptr);
    cmds[1] = strtok_r(NULL, ":", &ptr);
    
    stringComplete = true;
  }
}

Vous avez survécu ? Très bien, passons donc aux questions.

Comment faire donc pour les commandes suivantes envoyées sur Serial ?
pwm:0 -> flag = 0; et pwm:1 -> flag = 1;
pi:3.5 -> chargera un double avec 3.5
ki:0.8 -> chargera un double avec 0.8
kp: 3 -> chargera un double avec 3

Je rajouterais surement d'autres commandes. Mais là, après autant d'heures d'essais et des dizaines de pages consultés, je suis dans l'état confus si bien que, comme le dit l'expression : "je donne ma langue au chat".

Bonjour,

Il suffit de comparer cmds[0] avec toutes les chaines de commande

void loop() {
  // put your main code here, to run repeatedly:

  if (stringComplete) {
    //Serial.println(cmds[0]);
    //Serial.println(cmds[1]);

    if (strcmp(cmds[0], "pwm") == 0)
    {
      flag=atoi(cmds[1]);
    }
    else if (strcmp(cmds[0], "pi") == 0)
    {
      pi=atof(cmds[1]);
    }
    else if (strcmp(cmds[0], "ki") == 0)
    {
      ki=atof(cmds[1]);
    }
    // ... autres commandes
    stringComplete = false;
  }
}

Et bien, ça fonctionne :slight_smile:

Un grand merci à toi pour cette aide. C'était pourtant si simple que je suis passé à côté...

Bref, le principal c'est que ça puisse faire avancer les choses et ça servira peut-être aussi à d'autres.

En tout cas, je garde ce thread dans mes tablettes.