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


7

Neu bei Arduino Ich habe Probleme mit dem, was sich nach einem ziemlich n00b-Problem anhört ... Ich habe ein Adafruit-GPS-Board an mein Arduino angeschlossen und es funktioniert, da es GPS-Daten an die serielle Schnittstelle mit ausspuckt Serial.print(GPS.latitude, DEC)

Ich möchte jetzt eine Zeichenfolge zusammenfassen, die ich verarbeiten kann (lesen Sie: Ich möchte sie ü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)daraus resultiere:4418.5937996050

Also ist es wahrscheinlich zu groß oder so ...

Wie kann ich die Vars zusammenfassen und die lange Zeichenfolge erstellen?


Vermissen Sie nicht ein Semikolon?
TheDoctor

und einer sagt, vnntwährend ein anderer sagtvannut
TheDoctor

Sorry einige Tippfehler :)
stUrb

Kennen Sie den Datentyp von GPS.latitude? Zum Beispiel ist es ein float, intusw.?
Peter Bloomfield

Ich denke, es ist ein Schwimmer? In der Fehlermeldung steht float. Wie kann ich das herausfinden? Gibt es einen var_dump oder so?
stUrb

Antworten:


7

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

Daher weiß der Compiler nicht, wie er den Float in eine Ganzzahl umwandeln soll (wahrscheinlich wird er abgeschnitten), da es mehrere Optionen gibt.

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, um eine (char) Zeichenfolge kompakt zu erstellen:

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

1
+1 im Zweifelsfall, sprintfes raus :)
Madivad

1
Ein Punkt der Vorsicht: sprintf()ist eine komplexe Funktion, daher ist sie ziemlich langsam und benötigt ziemlich viel Speicher. Im Allgemeinen würde ich es für "Produktions" -Code vermeiden (nur für Debug-Zwecke aufbewahren).
jfpoilpret

Das ist 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, ob sscanf () tatsächlich gut in Arduino funktioniert)
Drodri

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 die generierte Baugruppe überprüfen. In Bezug auf sscanfIIRC gibt es einige Einschränkungen (mit Gleitkommazahlen, denke ich).
Jfpoilpret
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.