Hallo zusammen,
ich habe Schwierigkeiten, dass ein String bestehend aus zwei anderen Strings und einer Zahl( bestehend aus einem Long Datentyp) im Seriellen Monitor nicht richtig angezeigt wird. Ich vermute, dass das Problem dadurch entstanden ist, dass die Schnittstelle geändert wurde. Vorab:
-
Ich habe überprüft, dass im Gerätemanager mein Arduino von AZ-Delivery auf COM3 liegt und das auch im IDE eingestellt ist.
-
Meine Baudrate auf 9600 eingestellt ist bei Serial.begin(9600) und im Seriellen Monitor.
-
Ich habe mehrmals COM3 auf COM1 geändert und deinstalliert und neue Treiber geladen und auch die Arduino Software neu installiert und meinen Arduino zurückgesetzt, dass ich ein "neues Dokument" das eine leeres Void setup() und ein leeres Void loop() enthält darauf geladen habe.
Bei dieser Schreibweise enstehen im seriellen Monitor jeweils nur Absätze, die durch Serial.Print(Str_ausgabe_0) und Serial.Print(Str_ausgabe_1) zustande kommen jedoch der Inhalt nicht angezeigt wird.
Variante 1
void Reset_Taster() {
if (digitalRead(pinTaster_RE) == LOW)
{
startTime = millis();
while (digitalRead(pinTaster_RE) == LOW)
;
duration = millis() - startTime;
if (duration <= Haltezeit) {
String Str_RE_0 = "Der Reset-Taster wurde ";
String Str_ms_0 = " ms gehalten.";
String Str_ausgabe_0 = Str_RE_0 + duration + Str_ms_0;
Serial.println(Str_ausgabe_0);
ruecksetzen = 0;
}
else if (duration >= Haltezeit) {
String Str_RE_1 = "Der Reset-Taster wurde ";
String Str_ms_1 = " ms gehalten. Die Zählung wurde zurückgesetzt.";
String Str_ausgabe_1 = Str_RE_1 + duration + Str_ms_1;
Serial.println(Str_ausgabe_1);
ruecksetzen = 1;
}
}
if (ruecksetzen == 1) {
value = 0;
counter = 0;
ruecksetzen = 0;
}
}
Wenn ich den Code so schreibe wird alles im seriellen Monitor angezeigt:
Variante 2
void Reset_Taster() {
if (digitalRead(pinTaster_RE) == LOW)
{
startTime = millis();
while (digitalRead(pinTaster_RE) == LOW)
;
duration = millis() - startTime;
if (duration <= Haltezeit) {
Serial.print("Der Reset-Taster wurde ");
Serial.print(duration);
Serial.println(" gehalten");
ruecksetzen = 0;
}
else if (duration >= Haltezeit) {
Serial.print("Der Reset-Taster wurde ");
Serial.print(duration);
Serial.println(" gehalten. Die Zählung wurde zurückgesetzt");
ruecksetzen = 0;
ruecksetzen = 1;
}
}
if (ruecksetzen == 1) {
value = 0;
counter = 0;
ruecksetzen = 0;
}
}
Ich weiß nicht mehr weiter. Bevor ich die "Schnittstellen-Probleme" hatte lief der Code auch mit der ersten Variante also nur über ein Serial.println(). Woran könnte das liegen? Hat jemand schon ähnliche Erfahrungen gemacht? Über eure Hilfe würde ich mich freuen.
Mit freundlichen Grüßen,
Alexander
aus_txt.ino (3.82 KB)
Wenn ich den Code so schreibe wird alles im seriellen Monitor angezeigt:
Wieso willst du es dann anders machen? Das sollte zwar so oder so gehen, aber Strings für die serielle Ausgabe zusammenzubasteln verschwendet nur Speicher und Zeit. Es gibt sehr wenige Anwendungen wo man sowas wirklich als eine einzige Zeichenkette braucht
Hallo Serenifly,
danke für deine Hilfe. Ich fande die Variante 1 "ordentlicher" aber das ist eher ein subjektives Empfinden bei dem ich auch gerne offen bin für andere Vorschläge, da ich noch nicht so viel Erfahrung habe. Jetzt da du sagst, dass es nur unnötig Speicher und vermutlich meinst du Rechenzeit verschwendet, werde ich Variante 2 benutzen und bin damit erstmal erleichtert, wenigstens eine Lösung zu haben, die in Ordnung ist und funktioniert. Jedoch fuchst es mich einfach, dass es nicht mehr geht und ich würde gerne den Grund dafür wissen.
Hallo Peter,
danke für den Link. Ich werde es mir durchlesen. Hatte auch schon die Vermutung, dass es an den unterschiedliche Datentypen liegt. IWe gesagt nur komisch, dass es vor den Schnittstellen Problemen geklappt hat.
Hallo,
Schnittstelle ist nicht das Problem.
ich vermute Speicher zu klein. Wenn das ein UNO ist könnte das sein. Lass versuchsweise mal die Anzeige weg.
String Objekte sind eigendlich für den UNO auch ganz schlecht, die benötigen viel Speicher und der freie Speicher kann auch immer kleiner werden. Dann kommt es zu seltsamen Ergebnissen bis zum Absturz. Besser sind C Zeichenketten.
Heinz
Wenn du willst dass es etwas übersichtlicher aussieht und du weniger Schreibarbeit hast verwende das:
http://arduiniana.org/libraries/streaming/
Das sieht dann aus wie in normalem C++ auf dem PC mit dem Streaming Operator <<
Tatsächlich wird aber nichts anderes wie bei print()/println() gemacht, da nur der Operator überladen wird
Hallo Heinz,
daran lag es anscheinend wirklich. Ich habe es ausprobiert so wie du gesagt hast. Vielen Dank für den sehr guten Hinweis! Der Speicher war ~66% belegt. Das hat anscheinend schon ausgereicht um Probleme zu schaffen. Ich werde nun mit Variante 2 im Code weiter arbeiten. Nochmals Danke an alle die geantwortet haben. Wünsche euch ein schönes Wochenende.
PS: Danke für den Tip mit der Übersicht und der streaming librarie Serenifly. Ich werde mal rein schauen.
alexander21159:
Der Speicher war ~66% belegt.
Das Problem dieser Anzeige ist, dass sie nur die global und statisch definierten Variablen im Ram berücksichtigt. Der Platz den der Stack ( und damit alle lokaeln Variablen ) und der Heap braucht, sind da nicht enthalten. Der 'Heap' enthält die dynamisch definierten Variablen. Normalerweise braucht man das auf dem Arduino kaum. Der Datentyp 'String' macht jedoch intensiv davon Gebrauch. Und davon sieht man in der angezeigten Speicherbelegeung eben nichts.
Außerdem für String Literale in Zusammenhang mit print()/println() das F()-Makro verwenden:
Serial.println(F("Text hier"));
Dann belegt das kein RAM