Hogyan építsünk fel (összefűzünk) egy nagy számú karakterláncot?

Új az arduino-ban? Én azzal küzdök, ami meglehetősen n00b problémának tűnik … Vezetékes voltam fel egy adafruit GPS-táblát az Arduino-mhoz, és működik, mivel a GPS-adatokat a soros portra köpi Serial.print(GPS.latitude, DEC)

Most egy sztringet szeretnék összefűzni amelyet feldolgozhatok (olvasható: Ethernet kliensen keresztül szeretném elküldeni.) Ezt már meg is kaptam:

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

A hibaüzenet a következő: Call of overloaded "concat(float&)" is ambiguous Amikor Serial.print(GPS.latitude, DEC) ezt eredményezi: 4418.5937996050

Tehát ez valószínűleg nagy vagy valami …

Hogyan tudnám összefűzni a varokat és létrehozni a hosszú karakterláncot?

Megjegyzések

  • Aren ' t hiányzik egy pontosvessző?
  • és az egyik azt mondja, hogy vnnt, míg egy másik mondja: vannut
  • Sajnáljuk, hogy elgépelt egy kicsit ' s 🙂
  • Ismeri a GPS.latitude adattípusát? Például. float, int stb.?
  • szerintem ' úszik? Azt mondja, lebegnek a hibaüzenetben. Hogyan tudhatom meg? Van-e var_dump vagy valami?

Answer

A concat függvény nem lebegő verziót valósít meg, de néhányat of char, int, unsigneds …

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

így a fordító nem tudja, hogyan kell önteni (valószínűleg az úszót csonkolva) egész számra, mivel több lehetőségek.

Először konvertálnia kell az úszóját karakterláncra, használja a dtostrf () vagy a sprintf () parancsot, majd összefűzze a karakterláncát.

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

vagy

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

És akkor:

vnnt.concat(outstr) 

Ne feledje, hogy a sprintf nagyon hasznos (char) karakterlánc kompakt létrehozása:

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

Megjegyzések

  • +1, ha kétségei vannak, sprintf ki 🙂
  • Az óvatosság egyik pontja: sprintf() összetett függvény, ezért inkább lassú és elég sok memóriát használ. Általában elkerülném a " termelési " kódot (csak hibakeresési célokra).
  • Vagyis jó pont @jfpoilpret, nem vettem figyelembe. Van valamilyen nagyságrendű hatékonysága a dtostrf + concat verzióval szemben? Ugyanez vonatkozik az sscanf () -re is? (btw, most már kétlem, hogy az sscanf () valóban jól működik-e az arduino-ban)
  • Nem végeztem tényleges méréseket mindkét hívás összehasonlításához, de azt hiszem, csak be lehetne nézni a C kódba, és esetleg ellenőrizni a létrehozott szerelvény. Az sscanf tekintetében az IIRC-nek vannak bizonyos korlátai (szerintem lebegőpontos számokkal).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük