Come costruire (concatenare) una stringa con numeri grandi

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

  • Non ' ti manca un punto e virgola?
  • e uno dice vnnt mentre un altro dice vannut
  • Mi dispiace qualche errore di battitura ' s 🙂
  • Conosci il tipo di dati di GPS.latitude? Per esempio. è un float, int e così via?
  • Penso che sia ' un galleggiante? Dice float nel messaggio di errore. Come posso scoprirlo? Cè un var_dump o qualcosa del genere?

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).

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *