Ú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
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).
vnnt
, míg egy másik mondja:vannut
GPS.latitude
adattípusát? Például.float
,int
stb.?