Hallo! Ich wollte fragen ob mir jemand sagen kann wie ich mit Serial Read folgendes ausleen kann und dieses dann beim komma splitten kann und 2 port je nach dem vorstehenden unter nach dem kommastehenden wert ein/ausschalten kann.
die "nachricht" soll so aussehen: 1,1 oder 1,0 oder 0,1 oder 0,0
nitram0598:
Hallo! Ich wollte fragen ob mir jemand sagen kann wie ich mit Serial Read folgendes ausleen kann und dieses dann beim komma splitten kann und 2 port je nach dem vorstehenden unter nach dem kommastehenden wert ein/ausschalten kann.
die "nachricht" soll so aussehen: 1,1 oder 1,0 oder 0,1 oder 0,0
Wie werden die Nachrichten konkret gesendet, hast Du vielleicht irgendwelche Informationen zum Übertragungsprotokoll vergessen mitzuteilen?
Mal angenommen, diese vier Nachrichten kommen direkt hintereinander an, kommt dann sowas:
1,11,00,10,0
Die Nachrichten ohne Trennzeichen und ohne Pausen zwischen den Nachrichten hintereinander weg???
Oder sind die Nachrichten vielleicht irgendwie getrennt, z.B. mit einem Zeilenende-Trennzeichen (CR, LF oder CRLF) nach jeder Nachricht (z.B. beim Senden über den seriellen Monitor)?
Oder sind die Nachrichten wenn nicht mit einem Trennzeichen getrennt, dann vielleicht mit einem Timeout (kurze Sendepause zwischen zwei Nachrichten) getrennt?
Hallo,
wenn ich Deine Frage richtig verstanden habe, sollte das so gehen:
int state = 1;
void setup() {
Serial.begin(9600);
}
void loop() {
byte wert;
byte wert1, wert2;
if(Serial.available() > 0) {
wert = (byte) Serial.read();
if(state == 1) {
if(wert == '0') {
wert1 = LOW;
state++;
}
if(wert == '1') {
wert1 = HIGH;
state++;
}
} else if(state == 2) {
if(wert == '0') {
wert2 = LOW;
state++;
}
if(wert == '1') {
wert2 = HIGH;
state++;
}
}
}
if(state == 3) {
// wert1 und wert2 enthalten jetzt LOW oder HIGH,
// damit könnte dann etwas geschaltet werden, z.B.
// digitalWrite(pin, wert1);
// dabei muss natürlich statt pin die entsprechende
// Pinnummer angegeben werden.
// Hier wird statt zu schalten nur mal eine Ausgabe gemacht
Serial.println(wert1);
Serial.println(wert2);
state = 1;
}
}
Die kleine State-Maschine überliest einfach ungültige Zeichen und akzeptiert nur die 0 oder die 1. Wie die Sequenz getrennt wird ist egal, allerdings muss zwischen den beiden Zahlen - wie Du das oben beschrieben hast - ein Trennzeichen vorhanden sein, Du hattest ein Komma in Deinem Post angegeben. Sollten noch Fragen sein, frag einfach.
Gruß,
Ralf
[Edit:] Muss kein Trennzeichen mehr dazwischen sein, kann "01" oder "0,1", " 0 , 1 " oder "0 , Return Linefeed 1 " sein, ist auch egal.
Oder man nimmt das Beispiel
ReadASCIIString
Da wird genau das geamcht.
guntherb:
Oder man nimmt das Beispiel
ReadASCIIString
Hallo,
aber das Beispiel funktioniert nur, wenn die Sequenz mit Newline abgeschlossen wird.
Außerdem hat der TO angegeben, das 0 oder 1 ausgewertet werden soll, Serial.parseInt() liefert aber Integerzahlen zurück, also z.B. auch 2, 3, 47 oder 17328. Da würde man dann anfangen müssen auszuwerten. Außerdem, was wenn "10" kommt? Serial.parseInt() liefert dann eine Zehn zurück. Es soll aber zuerst eine Eins und dann eine Null ausgewertet werden. Da muss man dann weitere Logik dazuprogrammieren, um solche Fälle auch korrekt abzudecken.
Gruß,
Ralf
Ich hätte ja schon mal gerne gewusst, wie der TO zu meinem Lösungsvorschlag steht, aber scheinbar gibt es hier keine Antwort mehr.
Schade eigentlich.
Gruß,
Ralf