Wie man einen String mit großen Zahlen erstellt (concat)

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 anderer vannut
  • sagt. Tut mir leid, Tippfehler ' s 🙂
  • Kennen Sie den Datentyp von GPS.latitude? Z.B. Ist es ein float, 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).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.