Hallo,
auch ich wünsche ein frohes neues Jahr.
Kannst du mal Blinken.length() ausgeben ? Stehen da wirklich nur 2 Zeichen drin, nicht etwa z.B. "ja\r" ?
Hallo,
zuerst wünsche ich euch ein frohes neues Jahr.
Das folgende Programmchen empfängt über die Serielle SS 2 ein "ja", das ich im Seriellen Monitor auch sehen kann.
In dem if - Befehl soll der Ausgang 13 auf HIGH gesetzt werden. Das passiert auch, wenn der "digitalWrite(ausgang, HIGH);" außerhalb des if steht, klappt aber nicht im if.
Mir fällt da nichts zu ein. Vielleicht erkennt jemand von euch den Fehler ja sofort.
Danke fürs Hinschauen.
Code:int ausgang = 13; String Blinken = "1"; void setup() { Serial.begin (250000); while (!Serial); Serial2.begin (9600); while (!Serial); pinMode (ausgang, OUTPUT); } // Hier beginnt die Schleife void loop() { if (Serial2.available()) // Info verfügbar? { Blinken = Serial2.readStringUntil('\n'); // Info einlesen } Serial.print("Blinken = "); Serial.println(Blinken); if (Blinken == "ja") { digitalWrite(ausgang, HIGH); /* delay(500); digitalWrite(ausgang, LOW); delay(500); */ } //****************** ENDE if(Blinken == "ja") } //****************** ENDE LOOP
Hallo,
auch ich wünsche ein frohes neues Jahr.
Kannst du mal Blinken.length() ausgeben ? Stehen da wirklich nur 2 Zeichen drin, nicht etwa z.B. "ja\r" ?
Länge ist 3, aber welches?
Wahrscheinlich schickst du die falsche Terminierung. Im Seriellen Monitor kann man das unten rechts umstellen. Mit 'Neue Zeile' sollte es funktionieren.
Tja, das ist eine typische Fehlerquelle bei solcher Art von Empfangslogik.
Das readStringUntil hat da diverse Nachteile:
- es könnten noch Reste alter Daten im Empfangspuffer stehen, die dann vorne an das "ja" drankommen,
- ein Windowszeilenumbruch besteht z.B. aus \r und \n, deswegen könnte noch das \r da drin stehen,
- wenn man bei der Eingabe den Cursor bewegt hat oder was gelöscht hat, könnte da noch anderes reingeraten.
Also besser mit read() jedes Zeichen einzeln einlesen, bis nichts mehr kommt, und alles wegschmeissen, was man nicht braucht.
Wenn ich die SS2 nur mit read auslese, erhalte ich hex 106, 97,13,10 das sind j, a, CR und LF.
Das wäre ja fast plausibel, da ich das "ja" von einem anderen Arduino mit println sende. Aber das sind ja nun 4 und nicht 3 Zeichen.
Ich bin über dieses Problem auch deshalb so erstaunt, weil ich das aus einem andern Programm genau so übernommen habe, erhalte da die SS-Signale jedoch über ein Bluetooth-Modul HC06 von einer Tablet-App.
Geändert von fredyxx (03.01.2017 um 11:37 Uhr)
Naja, readStringUntil('\n') liesst alle Zeichen bis '\n'. Da dies als Trennzeichen gewertet wird, wird es nicht in den Rückgabestring geschrieben.
Ich habe das Problem nun folgendermaßen behoben:
Blinken = Serial2.readStringUntil('\n');.....ersetzt durch.....Blinken = Serial2.readStringUntil('\r');
und
if (Blinken == "ja").....ersetzt durch.....if (Blinken.substring(1) == "ja").....da wird dann das erste Zeichen nicht mitgenommen.
Danke für eure Hilfen
Gruß
fredyxx
Damit liest du erst ab der zweiten 'ja'-Nachricht. Die erste wird ignoriert.
Mach besser sowas:
Damit löscht du das '\r' in der Nachricht, falls es vorkommt.Code:if (Serial.available()) { str = Serial.readStringUntil('\n'); str.replace("\r", "\0"); }
Geändert von Sisor (03.01.2017 um 13:33 Uhr)
Danke, das sind wohl die Feinheiten, die man Erfahrung nennt!!
Lesezeichen