ny til arduino Jeg sliter med det som høres ut som ganske n00b problem … Jeg har kablet opp et adafruit GPS-kort til min Arduino og det fungerer når det spytter ut GPS-data til serieporten med Serial.print(GPS.latitude, DEC)
Jeg vil nå konkatere en streng som jeg kan behandle (les: Jeg vil sende det via en Ethernet-klient.) Dette har jeg allerede 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);
Feilmeldingen er: Call of overloaded "concat(float&)" is ambiguous
Når jeg Serial.print(GPS.latitude, DEC)
resulterer det i: 4418.5937996050
Så det er sannsynligvis for stor eller noe …
Hvordan kan jeg konkatere vars og lage den lange strengen?
Kommentarer
Svar
Concat-funksjonen implementerer ikke en flytversjon, men noen av char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
slik at kompilatoren ikke vet hvordan man skal kaste (trunker sannsynligvis flottøren) til heltall, da det er flere alternativer.
Du må først konvertere float til streng, bruk dtostrf () eller sprintf () og deretter concat til streng.
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
Og så:
vnnt.concat(outstr)
Legg også merke til at sprintf er veldig nyttig for kompakt opprettelse av en (char) streng:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Kommentarer
- +1 når du er i tvil,
sprintf
det ut 🙂 - Et forsiktighetspunkt:
sprintf()
er en kompleks funksjon, derfor er den heller treg og bruker ganske mye minne. Generelt vil jeg unngå det for " produksjon " kode (bare oppbevares for feilsøking). - Det vil si et godt poeng @jfpoilpret, jeg tok ikke hensyn til det. Har du en effektivitetsstørrelse i forhold til en dtostrf + concat-versjon? Gjelder det samme for sscanf ()? (btw, jeg tviler nå på om sscanf () faktisk fungerer bra i arduino)
- Jeg utførte ikke faktiske målinger for å sammenligne begge samtalene, men jeg antar at man bare kan ta en titt på C-koden og muligens sjekke den genererte forsamlingen. Når det gjelder
sscanf
, IIRC, har den noen begrensninger (med flytende tall tror jeg).
vnnt
mens en annen siervannut
GPS.latitude
? F.eks. er det enfloat
,int
osv.?