Cum se construiește (concat) un șir cu numere mari

nou în arduino „Mă lupt cu ceea ce sună ca o problemă destul de n00b … M-am conectat o placa GPS adafruit pe Arduino și funcționează deoarece scuipă date GPS pe portul serial cu Serial.print(GPS.latitude, DEC)

Acum vreau să concat un șir pe care îl pot procesa (citiți: vreau să-l trimit printr-un client ethernet.) Acesta este ceea ce am primit deja:

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

Mesajul de eroare este: Call of overloaded "concat(float&)" is ambiguous Când Serial.print(GPS.latitude, DEC) rezultă: 4418.5937996050

Deci este probabil prea mare sau ceva …

Cum pot concata varurile și să creez șirul lung?

Comentarii

  • Nu ' îți lipsește un punct și virgulă?
  • și unul spune vnnt în timp ce altul spune vannut
  • Ne pare rău ceva greșeală ' s 🙂
  • Știți tipul de date al GPS.latitude? De exemplu. este un float, int etc.?
  • Cred că este ' este un plutitor? Se spune float în mesajul de eroare. Cum pot afla? Există un var_dump sau ceva?

Răspuns

Funcția concat nu implementează o versiune float, ci unele of char, int, unsigneds …

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

astfel încât compilatorul nu știe cum să arunce (trunchierea probabil flotantului) la număr întreg, deoarece există mai multe Opțiuni.

Trebuie să vă convertiți mai întâi plutitorul în șir, utilizați dtostrf () sau sprintf () apoi concatați în șirul dvs.

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

sau

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

Și apoi:

vnnt.concat(outstr) 

De asemenea, rețineți că sprintf este foarte util pentru crearea compactă a unui șir (char):

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

Comentarii

  • +1 în caz de îndoială, sprintf it out 🙂
  • Un punct de precauție: sprintf() este o funcție complexă, prin urmare este mai degrabă lent și folosește destul de multă memorie. În general, l-aș evita pentru codul " de producție " (păstrat numai în scopuri de depanare).
  • Aceasta este un punct bun @jfpoilpret, nu am luat în calcul. Aveți o anumită ordine de mărime a eficienței față de o versiune dtostrf + concat? Același lucru se aplică sscanf ()? (btw, acum mă îndoiesc dacă sscanf () funcționează bine în arduino)
  • Nu am efectuat măsurători reale pentru a compara ambele apeluri, dar cred că s-ar putea să aruncăm o privire asupra codului C și, eventual, să verificăm ansamblul generat. În ceea ce privește sscanf, IIRC are unele limitări (cred cu numere în virgulă mobilă).

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *