PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : einfaches Programm, simpler Fehler, aber wo?



fredyxx
03.01.2017, 09:36
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.



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

Mxt
03.01.2017, 09:49
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" ?

fredyxx
03.01.2017, 09:54
Länge ist 3, aber welches?

Sisor
03.01.2017, 10:11
Wahrscheinlich schickst du die falsche Terminierung. Im Seriellen Monitor kann man das unten rechts umstellen. Mit 'Neue Zeile' sollte es funktionieren.

Mxt
03.01.2017, 10:17
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.

fredyxx
03.01.2017, 10:27
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.

Sisor
03.01.2017, 10:37
Naja, readStringUntil('\n') liesst alle Zeichen bis '\n'. Da dies als Trennzeichen gewertet wird, wird es nicht in den Rückgabestring geschrieben.

fredyxx
03.01.2017, 11:38
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

Sisor
03.01.2017, 12:17
Damit liest du erst ab der zweiten 'ja'-Nachricht. Die erste wird ignoriert.
Mach besser sowas:

if (Serial.available()) {
str = Serial.readStringUntil('\n');
str.replace("\r", "\0");
}Damit löscht du das '\r' in der Nachricht, falls es vorkommt.

fredyxx
03.01.2017, 13:13
Danke, das sind wohl die Feinheiten, die man Erfahrung nennt!!