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
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ă).
vnnt
în timp ce altul spunevannut
GPS.latitude
? De exemplu. este unfloat
,int
etc.?