string, substring, sscanf, strtok...

Bonjour, je tiens tout d’abord à préciser que je débute en arduino et en C.

Voici mon problème : je reçois sur la carte arduino à intervalle régulier un message string sous la forme “<xx.xx xx.xxaxxx.xx>” (les guillemets n’en font pas partie). Ce message a une longueur constante. Mon but est d’y soustraire 3 substring, à savoir “xx.xx”, “xx.xx” et “xxx.xx” qui seront ensuite converties en float. J’ai déjà essayé avec une boucle for et la fonction string.charAt, cela fonctionne mais je cherche à optimiser le programme. J’ai ensuite testé avec sscanf mais je ne pense pas avoir réellement compris son fonctionnement puisque j’obtiens dans le moniteur série une succession de caractères délirants et défilants à grande vitesse. Finalement, j’ai essayé avec la fonction strtok, cela a fonctionné une fois mais l’opération ne se répète pas malgré que la fonction se trouve dans le void loop().

En conclusion ma requête serait : Comment bien utiliser les fonctions strtok et sscanf ou du moins bien les comprendre et éventuellement comment les appliquer sur le message que je reçois?

Je rajouterai que je ne cherche pas à obtenir un bout de code tout prêt à être appliqué mais bien de comprendre ces fonctions et leur(s) application(s). Merci pour les futures réponses.

jamy31:
je reçois sur la carte arduino à intervalle régulier un message

Par quel moyen le recevez vous ? port série ? (idéalement ne passez pas par la classe String)

voici un exemple de code avec atof() si le format est toujours fixé comme vous le dites:

char message[] = "<12.34 56.78a910.11>";

void setup() {
  Serial.begin(115200);
  float v1, v2, v3;
  // http://www.cplusplus.com/reference/cstdlib/atof/
  v1 = atof(message + 1);
  v2 = atof(message + 7);
  v3 = atof(message + 13);
  Serial.print(F("v1 = ")); Serial.println(v1);
  Serial.print(F("v2 = ")); Serial.println(v2);
  Serial.print(F("v3 = ")); Serial.println(v3);
}

void loop() {}

comme le format est fixe, on sait où commencent les nombres décimaux et on peut directement les convertir puisqu’il y a un séparateur “propre” à chaque fois

Merci pour votre réponse.
Je reçois via bluetooth sous forme de caractères.
Je n’avais pas envisagé cette solution (étant donné qu’avant je recevais une chaîne de taille non constante).
Je m’empresse d’essayer.