Hilfe: Serielle Ausgabe spinnt rum

Hallo zusammen,

ich bin nun schon ein paar Jahre mal mehr mal weniger am Arduino programmieren und basteln. Zurzeit arbeite ich an einer Bewässerungsanlage & Co. für den Balkon.

Ich habe schon jede Menge umgesetzt und stehe nun vor einem eigentlich einfachen Problem, aber komme einfach nicht auf die Lösung.

Ich möchte gerne Uhrzeiten und Daten in Strings speichern und diese in ein char* Array überführen. Diese sollen dann wieder in einem Ringspeicher abgespeichert werden.

Wenn ich nun das char* array “messZeiten” direkt nach der Code Zeile:

messZeiten[0] = string1;

per

    Serial.println(messZeiten[0] );

ausgebe, wird dieses im seriellen Monitor auch richtig ausgegeben.

Frage ich an spätere Stelle per Serial.Read und dem String “log” ab.
Dann erhalte ich komische Zeichen, wo eigentlich Datum und Uhrzeit stehen müssten.

Da ich leider keinen Teil des Codes als Fehlerquelle ausschließen kann, habe ich hier den ganzen Code angehängt. Der Ringspeicher ist zur Zeit auskommentiert.

Ich wäre euch richtig dankbar, wenn ihr einen Hinweis auf die mögliche Fehlerquelle hättet.

Anbei noch ein Screenshot der seriellen Ausgabe.

Vielen Dank euch schonmal :slight_smile:

Balkon-Steuerung_1.5.ino.ino (46.6 KB)

Du solltest Dich über den Unterschied zwischen String (Klasse) und C-string (char-Array) schlau machen.
Mit String.c_str() bekommst Du die c-String-Repräsentation, die Du mit strcpy auf ein Char-Array kopieren kannst.

Auf einem Arduino solltest Du allerdings die Nutzung der String-Klasse tunlichst vermeiden, da sie Deinen RAM fragmentiert und irgendwann zu unerklärlichen Fehlern führt.

Infos zu Zeichenketten habe ich hier zusammen getragen.

Gruß Tommy

Deine Technik die Einträge zu erzeugen ist völlig ungeignet.

Du bastelst dein Datum in einem lokalen char, merkst dir die Adresse diese lokalen Puffers
und hoffst dass dadurch irgendwo/irgendwie eine Kopie des Puffers erzeugt wird.

Faktisch trägst du einen ungültigen Zeiger in deine Liste ein.

   char string1[21] = {""};
    sprintf(string1, "%02d/%02d/%d - %02d:%02d:%02d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
    Serial.println(string1);
    messZeiten[0] = string1;
    Serial.println(messZeiten[0] );

Nimm lieber einen Array von Strukturen die ein Datum beinhalten.
Verschieben musst du die EInträge sowieso nicht wenn du einen zyklischen Buffer benutzt.

Diese Zeile (908) ist auch sehr optimistisch

     Serial1.print(messZeiten[504]);

wenn man

 char* messZeiten[25]={"","","","","","","","","","","","","","","","","","","","","","","","",""};

betrachtet.