Hur man bygger (concat) en sträng med stora siffror

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

  • Är ' t du saknar ett semikolon?
  • och en säger vnnt medan en annan säger vannut
  • Tyvärr skrivfel ' s 🙂
  • Känner du datatypen för GPS.latitude? T.ex. är det en float, int, etc.?
  • Jag tror att den ' en flottör? Det står flyt i felmeddelandet. Hur kan jag ta reda på det? Finns det en var_dump eller något?

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *