novinka v Arduinu bojuji s tím, co zní jako docela problém n00b … Jsem zapojen až adafruit GPS-board to my Arduino and it is working as it spits out GPS data to the serial port with Serial.print(GPS.latitude, DEC)
I Now want to concat a string které mohu zpracovat (číst: Chci to odeslat přes ethernetového klienta.) To je to, co jsem již získal:
...... 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);
Chybová zpráva je: Call of overloaded "concat(float&)" is ambiguous
Když jsem Serial.print(GPS.latitude, DEC)
vedl k: 4418.5937996050
Takže je pravděpodobně velký nebo tak něco …
Jak mohu zkonvertovat vars a vytvořit dlouhý řetězec?
Komentáře
Odpověď
Funkce concat neimplementuje float verzi, ale některé char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
takže kompilátor neví, jak vrhnout (zkrácení pravděpodobně float) na celé číslo, protože existuje několik možnosti.
Nejprve musíte převést svůj float na řetězec, použijte dtostrf () nebo sprintf () a poté na svůj řetězec concat.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
nebo
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
A pak:
vnnt.concat(outstr)
Všimněte si také, že sprintf je velmi užitečný pro kompaktní vytvoření řetězce (char):
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Komentáře
- +1, pokud máte pochybnosti,
sprintf
na to 🙂 - Je však třeba dávat pozor:
sprintf()
je komplexní funkce, a proto spíše pomalý a využívá docela dost paměti. Obecně bych se tomu vyhnul pro " produkční " kód (pouze pro účely ladění). - To je dobrý bod @ jfpoilpret, nebral jsem v úvahu. Máte nějaký řád účinnosti oproti verzi dtostrf + concat? Totéž platí pro sscanf ()? (btw, nyní pochybuji, že sscanf () ve skutečnosti funguje arduino)
- neprovedl jsem skutečná měření, abych porovnal oba hovory, ale myslím, že by se dalo jen podívat na kód C a případně zkontrolovat generovaná sestava. Pokud jde o
sscanf
, IIRC, má určitá omezení (myslím s čísly s plovoucí desetinnou čárkou).
vnnt
zatímco jiný říkávannut
GPS.latitude
? Např. je tofloat
,int
atd.?