Go Down

Topic: extraire chaine caractere (Read 175 times) previous topic - next topic

junior1978

Bonjour

Je suis en train d'essayer d'échanger des informations entre 2 arduino en point à point avec des modules Lora RF95.

Pour envoyer les datas je les concatène dans mon arduino émetteur (ça c'est ok)

Dans mon arduino récepteur je reçois bien mes datas.

Maintenant je voudrais séparer mes datas.

En ce moment je reçois par exemple la data: 1.10;12.13
Si je l'affiche sur la sortie série je la voie bien sur mon arduino récepteur.

Pour les séparer j'ai utilisé sscanf, j'arrive bien à récupérer ma première valeur, je récupère bien 1.10 par contre ça marche pas pour la seconde valeur, je récupere 0.00. J'aimerais pour la suite avoir plus de data mais je pense que si ça marche pour 2 je serais faire pour plusieurs...

Je met mon code actuel. Il est peut être pas parfait (il l'est forcement pas vu qu'il marche pas à 100%), ça fait que 3 jours que je débute avec arduino et mes notions de programmation sont limitées...et j'ai essayé pas mal de choses avant de poser ma question!

Merci de votre aide

Vincent





junior1978

Je comprend pas, je viens de refaire un test et en fait même la première valeur je la récupère pas.

Merci encore de votre aide

Vincent

fdufnews

#2
Jul 12, 2018, 09:55 pm Last Edit: Jul 12, 2018, 10:07 pm by fdufnews
Plusieurs remarques
Code: [Select]
   char floatStr[50];
      char floatStr1[50];
      float amps;
      float volts;
      sscanf((char*)buf, " %f ; %f ", floatStr, floatStr1);
      amps=atof(floatStr);
      volts=atof(floatStr1);

floatStr et floatStr1 devraient être de type float puisque tu demandes d'extraire des flottants (d'ailleurs, le compilateur remonte un warning à ce sujet). Normalement, c'est le scanf qui fait la conversion et du coup le atof que tu ajoutes derrière est inutiles.
Le code corrigé serait comme ça. A noter howmany qui retourne le nombre de valeurs trouvées par sscanf (avec le code erroné howmany = 0)
Code: [Select]
 float amps;
  float volts;

  int howmany=sscanf((char*)buf, " %f ; %f ", &amps, &volts);


Mais surtout, le support des flottants n'est pas implémenté pour cette fonction car trop gourmand en ressources.
Tu peux t'en convaincre en changeant le type des données que tu manipules. il suffit de remplacer les float par des unsigned int par exemple et là ça marche (et howmany retourne 2)
Code: [Select]
 uint16_t amps;
  uint16_t volts;

  int howmany=sscanf((char*)buf, " %u ; %u ", &amps, &volts);


Pour règler ton problème, tu peux:
soit le faire à la main
- lire jusqu'au séparateur et faire un atof
- lire la suite et faire un atof
ou alors utiliser strtok qui est plus puissant mais un peu usine à gaz si tu ne veux extraire que 2 nombres.

junior1978

Merci de la réponse.

j'ai réussie avec une autre méthode (voir PJ)
je ne sais pas laquelle est la meilleure.

Merci encore

Vincent

hbachetti

Salut

L'utilisation de la classe String provoque de l'allocation / libération mémoire et de la fragmentation.

@+
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fdufnews

j'ai réussie avec une autre méthode (voir PJ)
je ne sais pas laquelle est la meilleure.
La meilleur solution c'est celle qui répond à ton besoin.

junior1978


Go Up