nyt til arduino Jeg kæmper med det, der lyder som et ret n00b-problem … Jeg har kablet op et adafruit GPS-kort til min Arduino, og det fungerer, da det spytter GPS-data til den serielle port med Serial.print(GPS.latitude, DEC)
Jeg vil nu konkatere en streng som jeg kan behandle (læs: Jeg vil sende det via en Ethernet-klient.) Dette har jeg allerede fået:
...... 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);
Fejlmeddelelsen er: Call of overloaded "concat(float&)" is ambiguous
Når jeg Serial.print(GPS.latitude, DEC)
resulterer det i: 4418.5937996050
Så det er sandsynligvis for stort eller noget …
Hvordan kan jeg sammenkæde Vars og oprette den lange streng?
Kommentarer
Svar
Concat-funktionen implementerer ikke en float-version, men nogle af char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
så compileren ved ikke, hvordan han skal kaste (trunker sandsynligvis float) til heltal, da der er flere muligheder.
Du skal først konvertere din float til streng, brug dtostrf () eller sprintf () og derefter concat til din 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)
Bemærk også, at sprintf er meget praktisk til kompakt oprettelse af en (char) streng:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Kommentarer
- +1 i tvivlstilfælde,
sprintf
det ud 🙂 - Et forsigtigt punkt er dog:
sprintf()
er en kompleks funktion, derfor er den snarere langsom og bruger en del hukommelse. Generelt ville jeg undgå det til " produktion " kode (kun opbevares til fejlfindingsformål). - Det er et godt punkt @jfpoilpret, jeg tog ikke højde for det. Har du en vis effektivitetsgrad i forhold til en dtostrf + concat-version? Gælder det samme for sscanf ()? (btw, jeg tvivler nu på, om sscanf () faktisk fungerer fint i arduino)
- Jeg udførte ikke faktiske målinger for at sammenligne begge opkald, men jeg gætter på, at man bare kunne se på C-koden og muligvis kontrollere den genererede samling. Med hensyn til
sscanf
, IIRC, har den nogle begrænsninger (med flydende tal tror jeg).
vnnt
mens en anden sigervannut
GPS.latitude
? For eksempel. er det enfloat
,int
osv.?