ny för arduino Jag kämpar med det som låter som ganska n00b-problem … Jag har kopplat upp ett adafruit GPS-kort till min Arduino och det fungerar när det spottar ut GPS-data till serieporten med Serial.print(GPS.latitude, DEC)
Jag vill nu konkata en sträng som jag kan bearbeta (läs: Jag vill skicka det via en Ethernet-klient.) Det här har jag redan fått:
...... 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);
Felmeddelandet är: Call of overloaded "concat(float&)" is ambiguous
När jag Serial.print(GPS.latitude, DEC)
resulterar det i: 4418.5937996050
Så det är förmodligen för stort eller något …
Hur kan jag sammanfoga vars och skapa den långa strängen?
Kommentarer
Svar
Concat-funktionen implementerar inte en flytversion, men en del av char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
så att kompilatorn inte vet hur man kastar (trunker troligen flottören) till heltal, eftersom det finns flera alternativ.
Du måste först konvertera din float till sträng, använd dtostrf () eller sprintf () och sedan concat till din sträng.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
eller
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
Och sedan:
vnnt.concat(outstr)
Observera också att sprintf är väldigt praktiskt för kompakt skapande av en (char) sträng:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Kommentarer
- +1 i tvivel,
sprintf
det ut 🙂 - En försiktighetspunkt:
sprintf()
är en komplex funktion, därför är den snarare långsam och använder ganska mycket minne. Generellt skulle jag undvika det för " produktion " -kod (bara för felsökningsändamål). - Det är en bra poäng @jfpoilpret, jag tog inte hänsyn till det. Har du någon storleksordning av effektivitet jämfört med en dtostrf + concat-version? Gäller samma sak för sscanf ()? (btw, jag tvivlar nu på om sscanf () faktiskt fungerar bra i arduino)
- Jag utförde inte faktiska mätningar för att jämföra båda samtalen, men jag antar att man bara kunde titta på C-koden och eventuellt kontrollera den genererade enheten. När det gäller
sscanf
, IIRC, har den vissa begränsningar (med flytande siffror tror jag).
vnnt
medan en annan sägervannut
GPS.latitude
? T.ex. är det enfloat
,int
, etc.?