Datum und Uhrzeit in String

Hallo,

wahrscheinlich ist es ein Denkfehler, aber ich komme einfach nicht weiter.
Ich möchte zusammen mit Sensorwerten das Datum und die Uhrzeit in eine SQL Datenbank speichern.
Datum und Uhrzeit kommen aus DS3231 und werden jeweils aus Einzelwerten zusammengesetzt. Etwa so:

sprintf(strDatum, "%02d.%02d.20%02d",vdate, vmonth, vyear );
sprintf(strUhrzeit, "%02d:%02d:%02d",vhour, vminute, vsecond);

strDatum und strUhrzeit sind als char[10] definiert.

Damit das Einfügen der Daten in SQL funktioniert, müssen die Werte in Strings umgewandelt werden,
dies mache ich per dtostrf - und versuche das auch beim Datum und der Uhrzeit.
Hierbei komme ich nicht weiter. Ich erhalte folgende Fehlermeldung:
cannot convert 'String' to 'double' for argument '1' to 'char* dtostrf(double, signed char, unsigned char, char*)'

Hat jemand einen Hinweis für mich, wie das das hinbekomme?

String s1(strDatum);
String s2(strUhrzeit);
dtostrf(s1, 1, 2, varDatum);
dtostrf(s2, 1, 2, varUhrzeit);

sprintf(query, INSERT_DATA, varTempBMP280, varPressBMP280, s1, s2);

Danke im voraus
Jan

Vergiss den ganzen String Kram (es sei denn dein Arduino hat eine 32 Bit CPU).

sprintf(query, INSERT_DATA, varTempBMP280, varPressBMP280, strDatum, strUhrzeit);

Damit das Einfügen der Daten in SQL funktioniert, müssen die Werte in Strings umgewandelt werden,

Wie kommst du darauf? Die ganzen C Funktionen arbeiten mit Null-terminierten char Arrays. Die String Klasse ist eine Arduino Erfindung und damit nicht kompatibel

Serenifly:
Die String Klasse ist eine Arduino Erfindung und damit nicht kompatibel

Die beliebte C++ String Klasse funktioniert auf dem Arduino wegen Speichermangels nicht,

es ist keineswegs eine Arduino Erfindung.

Die String Klasse (mit großem S) ist eine Arduino Erfindung. (Anscheinend in Arduino 1.01 aufgetaucht.)

Die C++ String Klasse (std::string) schreibt sich mit kleinem s. Die gibt es nicht auf allen 32 Bit Boards, z.B. auf dem Teensy geht sie, auf dem Due nicht.

Ich meinte klar die Arduino String Klasse. Die funktioniert auch etwas anders als die C++ Version

Na dann.

Strings sind halt der Versuch abgespeckte std:string Funktionalität für Noobs zu bieten.

Von mir aus nennt das Erfindung, ich empfinde es als Falle (auf 8-Bit Systemen).

Hallo,

ihr ratet alle von Strings/strings ab. Nur was ist nun die Lösung? Was ist so schlimm an String/string? Außer dass man etwas RAM für Buffer benötigt und etwas mehr Rechenzeit?

Strings sind hier schon mal keine Lösung weil er C Funktionen wie sprintf() und dtostrf() verwendet. Damit hat er schon char Arrays. Wieso also das mit Strings komplizierter machen als nötig?

C Strings kann man an printf() mit %s übergeben. Mit %S gehen auch PROGMEM Konstanten

Übrigens ist es meistens auch ein Irrtum zu denken das überhaupt in einem String versenden zu müssen. Mit den meisten Bibliotheken kann man einfach mehrmals hintereinander print() machen

Wenn ich es richtig verstanden habe, fragmentiert die Arduino-Implementierung der Strings den ohnehin schon knappen RAM und damit ist bald nicht mehr genügend zusammenhängender RAM frei, besonders wenn man oft + verwendet.

Der andere Grund: die C-Funktionen für Charrrays sind viel flexibler.
Wir hatten hier schon einige, die am Ende ihr gesamtes Programm von String befreien mussten, weil es nach einiger Laufzeit unerklärliche Reaktionen lieferte.

Gruß Tommy

Hallo,

ich dachte bis jetzt das char arrays und strings immer das gleiche wären. Nur eben ein anderer Name. Weil behandelt werden müssen alle doch eh gleich mit Nullterminator usw. Für mich machte das auch bisher keinen Unterschied. Bis auf die Tatsache das manche wenige string Funktion in der IDE nicht verfügbar sind. Deswegen wundere ich mich und ihr stellt mich gerade auf den Kopf. Vorher bekannte festgelegte strings habe ich bisher auch einfach über print rausgeschickt. Nur die Empfängerseite musste etwas mehr machen beim zusammensetzen ud vergleichen.

Tommy56 hat das Problem schon genannt. Die Stringklassen legen intern ihren Speicher mit malloc oder new an. Wird einem String etwas hinzugefügt, gibt es kurzzeitig ggf. drei belegte Speicherbereiche, den für den neuen größeren String, den alten und eventuell für den String der dazugefügt wird. Dadurch muss ziemlich oft neuer Speicher angefordert und wieder freigegeben werden. Das ist bei dem kleinen Speicher der 8 Bitter auf die Dauer problematisch, weil die freien Bereiche immer kleiner werden. Bei den größeren ARMs ist das nicht ganz so schlimm, außerdem ist die Standardbibliothek des g++ für die Cortex M auf wenig Speicherverbrauch optimiert.

Wo es geht, z.B. auf den Teensy, kann man auch den C++ Container array verwenden, der verwendet kein malloc oder new.

char test[]="test"; // benötigt 5 byte und dabei bleibt es während der Laufzeit
String test="test"; // String Objekt, benötigt so bereits mehr RAM, und hat im Prinzip keine max. Länge während der Laufzeit, bzw. variable Länge, je nach dem, was man damit macht. Deshalb auf 8-bit Arduinos zu vermeiden, da keine Garbage Collection gemacht wird.

Hallo,

okay, der RAM Verbrauch ist unterschiedlich. War mir so nicht bewusst.

Danke.

Mit C Strings sind einige Sachen auch wesentlich einfacher. Vor allem Teil-Strings suchen, splitten und konvertieren.

Das einzige was mit String Objekten einfacher ist ist Konkatenieren. Aber gerade fallen Anfänger rein. reserve() wird praktisch nie verwendet. Und generell ist es oft nicht nötig. Gerade bei Ethernet Anwendungen meinen wohl Viele dass man einen String erst mal zusammensetzten muss und dann auf einmal senden. Statt einfach sowas zu tun:

client.print(datum);
client.print(zeit);
client.print(...);

Mit der Streaming Library geht das auch bequemer da man wie in Standard C++ den << Operator hat