nuovo ad arduino sto lottando con quello che sembra un problema abbastanza n00b … ho cablato metto una scheda GPS adafruit sul mio Arduino e funziona mentre sputa dati GPS sulla porta seriale con Serial.print(GPS.latitude, DEC)
Ora voglio concatenare una stringa che posso elaborare (leggi: voglio inviarlo tramite un client ethernet.) Questo è quello che ho già:
...... 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);
Il messaggio di errore è: Call of overloaded "concat(float&)" is ambiguous
Quando Serial.print(GPS.latitude, DEC)
risulta: 4418.5937996050
Così è probabilmente è troppo grande o qualcosa del genere …
Come posso concatenare le variabili e creare la stringa lunga?
Commenti
Answer
La funzione concat non implementa una versione float, ma alcuni of char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
quindi il compilatore non sa come eseguire il cast (troncando probabilmente il float) a integer, poiché ce ne sono diversi opzioni.
Devi prima convertire il tuo float in stringa, usare dtostrf () o sprintf () quindi concatenare la tua stringa.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
o
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
E poi:
vnnt.concat(outstr)
Nota anche che sprintf è molto utile per creazione compatta di una stringa (char):
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Commenti
- +1 in caso di dubbio,
sprintf
it out 🙂 - Un punto di cautela però:
sprintf()
è una funzione complessa, quindi è piuttosto lento e utilizza un po di memoria. In genere, lo eviterei per il codice " di produzione " (conservalo solo per scopi di debug). - Questo è un buon punto @jfpoilpret, non ho tenuto conto. Hai un certo ordine di grandezza di efficienza rispetto a una versione dtostrf + concat? Lo stesso vale per sscanf ()? (btw, ora dubito che sscanf () funzioni davvero bene in arduino)
- Non ho eseguito misurazioni effettive per confrontare entrambe le chiamate, ma immagino che si potrebbe semplicemente dare unocchiata al codice C e possibilmente controllare lassieme generato. Per quanto riguarda
sscanf
, IIRC ha alcune limitazioni (con numeri in virgola mobile credo).
vnnt
mentre un altro dicevannut
GPS.latitude
? Per esempio. è unfloat
,int
e così via?