neu bei Arduino Ich habe Probleme mit dem, was sich nach einem ziemlich n00b-Problem anhört … Ich habe verkabelt Wenn Sie ein Adafruit-GPS-Board an mein Arduino anschließen, funktioniert es, da es GPS-Daten mit Serial.print(GPS.latitude, DEC)
an die serielle Schnittstelle ausspuckt. Ich möchte jetzt eine Zeichenfolge verknüpfen was ich verarbeiten kann (lesen Sie: Ich möchte es über einen Ethernet-Client senden.) Folgendes habe ich bereits erhalten:
...... 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);
Die Fehlermeldung lautet: Call of overloaded "concat(float&)" is ambiguous
Wenn ich Serial.print(GPS.latitude, DEC)
, ergibt sich Folgendes: 4418.5937996050
So ist es ist wahrscheinlich zu groß oder so …
Wie kann ich die Vars zusammenfassen und die lange Zeichenfolge erstellen?
Kommentare
- Ist ' fehlt Ihnen kein Semikolon?
- und einer sagt
vnnt
, während ein anderervannut
- sagt. Tut mir leid, Tippfehler ' s 🙂
- Kennen Sie den Datentyp von
GPS.latitude
? Z.B. Ist es einfloat
,int
usw.? - Ich denke, es ist ' sa float? In der Fehlermeldung steht float. Wie kann ich das herausfinden? Gibt es einen var_dump oder so?
Antwort
Die concat-Funktion implementiert keine Float-Version, aber einige von char, int, unsigneds …
unsigned char String::concat(long unsigned int) unsigned char String::concat(unsigned int) unsigned char String::concat(int) ...
, sodass der Compiler nicht weiß, wie er den Float in eine Ganzzahl umwandelt (wahrscheinlich abschneidet), da es mehrere gibt Optionen.
Sie müssen zuerst Ihren Float in einen String konvertieren, dtostrf () oder sprintf () verwenden und sich dann auf Ihren String konzentrieren.
char outstr[25]; sprintf(outstr, "%f", GPS.latitude);
oder
dtostrf(GPS.latitude, 6, 2, outstr); //check docs for 6, 2 values, and set them for your needs
Und dann:
vnnt.concat(outstr)
Beachten Sie auch, dass sprintf sehr praktisch ist Kompakte Erstellung einer (Zeichen-) Zeichenfolge:
char msg[80]; sprintf(msg, "$VNNT,GPS, %s %f", GPS.fix, GPS.latitude);
Kommentare
- +1 im Zweifelsfall,
sprintf
it out 🙂 - Ein Punkt zur Vorsicht:
sprintf()
ist eine komplexe Funktion, daher eher langsam und verbraucht ziemlich viel Speicher. Im Allgemeinen würde ich es für " Produktions " Code vermeiden (nur für Debug-Zwecke aufbewahren). - Das heißt Ein guter Punkt @jfpoilpret, den ich nicht berücksichtigt habe. Haben Sie eine Größenordnung der Effizienz gegenüber einer dtostrf + concat-Version? Gilt das auch für sscanf ()? (Übrigens bezweifle ich jetzt, dass sscanf () in Arduino tatsächlich gut funktioniert.)
- Ich habe keine tatsächlichen Messungen durchgeführt, um beide Aufrufe zu vergleichen, aber ich denke, man könnte sich einfach den C-Code ansehen und möglicherweise überprüfen die generierte Baugruppe. In Bezug auf
sscanf
hat IIRC einige Einschränkungen (mit Gleitkommazahlen, denke ich).