Comment construire (concat) une chaîne avec de gros nombres

nouveau sur arduino Je me bats avec ce qui ressemble à un problème assez n00b … jai câblé monter une carte GPS adafruit sur mon Arduino et cela fonctionne car il crache des données GPS sur le port série avec Serial.print(GPS.latitude, DEC)

Je veux maintenant concater une chaîne que je peux traiter (lire: je veux lenvoyer via un client Ethernet.) Voici ce que jai déjà:

...... String vnnt = "$VNNT,"; if (GPS.fix) { vnnt += "GPS,"; //this works: vnnt.concat(GPS.fix); //but this not: vnnt.concat(GPS.latitude); }else{ vnnt += "INFO,Acquiring Sats"; } Serial.println(vnnt); 

Le message derreur est: Call of overloaded "concat(float&)" is ambiguous Quand je Serial.print(GPS.latitude, DEC) cela donne: 4418.5937996050

Donc est probablement trop gros ou quelque chose du genre …

Comment puis-je concaténer les variables et créer la longue chaîne?

Commentaires

  • Aren ' Il vous manque un point-virgule?
  • et lun dit vnnt tandis quun autre dit vannut
  • Désolé, une faute de frappe ' s 🙂
  • Connaissez-vous le type de données de GPS.latitude? Par exemple. est-ce un float, int, etc.?
  • Je pense que ' est un flotteur? Il dit float dans le message derreur. Comment puis-je le savoir? Y a-t-il un var_dump ou quelque chose?

Answer

La fonction concat nimplémente pas une version float, mais certaines of char, int, unsigneds …

unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ... 

donc le compilateur ne sait pas comment transtyper (tronquer probablement le flottant) en entier, car il y en a plusieurs options.

Vous devez dabord convertir votre float en chaîne, utiliser dtostrf () ou sprintf () puis concat en votre chaîne.

char outstr[25]; sprintf(outstr, "%f", GPS.latitude); 

ou

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

Et puis:

vnnt.concat(outstr) 

Notez également que sprintf est très pratique pour création compacte dune chaîne (char):

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Commentaires

  • +1 en cas de doute, sprintf it out 🙂
  • Une mise en garde cependant: sprintf() est une fonction complexe, donc cest plutôt lent et utilise pas mal de mémoire. Généralement, je léviterais pour le code de " production " (à conserver uniquement à des fins de débogage).
  • Cest un bon point @jfpoilpret, je nai pas pris en compte. Avez-vous un ordre de grandeur defficacité par rapport à une version dtostrf + concat? Est-ce que la même chose sapplique à sscanf ()? (btw, je doute maintenant que sscanf () fonctionne correctement dans arduino)
  • Je nai pas effectué de mesures réelles pour comparer les deux appels, mais je suppose que lon pourrait simplement jeter un coup dœil au code C et éventuellement vérifier lassemblage généré. En ce qui concerne sscanf, lIIRC a quelques limitations (avec des nombres à virgule flottante je pense).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *