Jak vytvořit (concat) řetězec s velkými čísly

novinka v Arduinu bojuji s tím, co zní jako docela problém n00b … Jsem zapojen až adafruit GPS-board to my Arduino and it is working as it spits out GPS data to the serial port with Serial.print(GPS.latitude, DEC)

I Now want to concat a string které mohu zpracovat (číst: Chci to odeslat přes ethernetového klienta.) To je to, co jsem již získal:

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

Chybová zpráva je: Call of overloaded "concat(float&)" is ambiguous Když jsem Serial.print(GPS.latitude, DEC) vedl k: 4418.5937996050

Takže je pravděpodobně velký nebo tak něco …

Jak mohu zkonvertovat vars a vytvořit dlouhý řetězec?

Komentáře

  • Chybí vám ' středník?
  • a jeden říká vnnt zatímco jiný říká vannut
  • Omlouvám se za překlep ' s 🙂
  • Znáte datový typ GPS.latitude? Např. je to float, int atd.?
  • Myslím, že ' sa float? V chybové zprávě je uvedeno float. Jak to zjistím? Existuje var_dump nebo něco?

Odpověď

Funkce concat neimplementuje float verzi, ale některé char, int, unsigneds …

unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ... 

takže kompilátor neví, jak vrhnout (zkrácení pravděpodobně float) na celé číslo, protože existuje několik možnosti.

Nejprve musíte převést svůj float na řetězec, použijte dtostrf () nebo sprintf () a poté na svůj řetězec concat.

char outstr[25]; sprintf(outstr, "%f", GPS.latitude); 

nebo

dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs 

A pak:

vnnt.concat(outstr) 

Všimněte si také, že sprintf je velmi užitečný pro kompaktní vytvoření řetězce (char):

char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude); 

Komentáře

  • +1, pokud máte pochybnosti, sprintf na to 🙂
  • Je však třeba dávat pozor: sprintf() je komplexní funkce, a proto spíše pomalý a využívá docela dost paměti. Obecně bych se tomu vyhnul pro " produkční " kód (pouze pro účely ladění).
  • To je dobrý bod @ jfpoilpret, nebral jsem v úvahu. Máte nějaký řád účinnosti oproti verzi dtostrf + concat? Totéž platí pro sscanf ()? (btw, nyní pochybuji, že sscanf () ve skutečnosti funguje arduino)
  • neprovedl jsem skutečná měření, abych porovnal oba hovory, ale myslím, že by se dalo jen podívat na kód C a případně zkontrolovat generovaná sestava. Pokud jde o sscanf, IIRC, má určitá omezení (myslím s čísly s plovoucí desetinnou čárkou).

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *