Sådan bygger du (konkat) en streng med store tal

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

  • Er ' t mangler du et semikolon?
  • og den ene siger vnnt mens en anden siger vannut
  • Beklager en skrivefejl ' s 🙂
  • Kender du datatypen for GPS.latitude? For eksempel. er det en float, int osv.?
  • Jeg tror det ' en svømmer? Der står svæv i fejlmeddelelsen. Hvordan kan jeg finde ud af det? Er der en var_dump eller noget?

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *