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
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).
vnnt
tandis quun autre ditvannut
GPS.latitude
? Par exemple. est-ce unfloat
,int
, etc.?