Hvordan bygge (slå sammen) en streng med store tall

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

  • Er ' t mangler du et semikolon?
  • og en sier vnnt mens en annen sier vannut
  • Beklager noen skrivefeil ' s 🙂
  • Kjenner du datatypen til GPS.latitude? F.eks. er det en float, int osv.?
  • Jeg tror det ' en flottør? Det står flyt i feilmeldingen. Hvordan kan jeg finne ut av det? Er det en var_dump eller noe?

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *