Seriell verschachtelte if-Anweisungen (funktioniert nicht)

Ich versuche seit ein paar Tagen, das zum Laufen zu bringen.

Was ich im Moment habe, ist TouchOSC, das auf meinem iPhone installiert ist und Befehle an ein Verarbeitungsprogramm sendet, das sie wiederum vereinfacht und sie seriell an meinen Arduino sendet.

Hier liegt mein Problem. Die Befehle kommen dort an und ich kann sie leicht genug ausdrucken. Sie kommen richtig an. Das Format ist t11 ​​oder t10 (t für Umschaltsteuerung, dann # für ID der geänderten Steuerung, die letzte # ist ein oder aus (1 oder 0).

Wenn ich jetzt versuche, dies mit if-Anweisungen aufzuschlüsseln, scheint es nie zu funktionieren. Ich weiß, dass die Daten korrekt sind, wenn sie zum Arduino gelangen.

Ich muss testen, ob das erste Zeichen eine einfache if-Anweisung ist

if(Serial.read() == 't')

vorher teste ich ob

Serial.available()

ist dann durch ähnliche if-Anweisungen wahr, die ich teste, wenn next die Zahl '1' oder '2' für die Kontroll-ID ist, dann, wenn die Zahl ein- oder ausgeschaltet ist, '1' oder '2'.

Wenn ich dies im seriellen Monitor oder mit echten Daten teste, scheint mein Telefon nie in die Schleifen zu geraten oder es zu einem und nicht zum anderen zu bringen. Manchmal kann ich es optimieren, um in alle zu gelangen, um die LED einzuschalten, aber dann schalte ich sie nicht aus oder umgekehrt.

Kann mir bitte jemand ein Beispiel für die Logik geben, die ich verwenden muss? Ich habe auch versucht, Switch-Anweisungen für die ID zu verwenden, die keinen großen Unterschied machen.

Kannst du den Code für deinen Parser posten?

Antworten (2)

Ohne Ihren Code zu sehen, nehme ich eine Vermutung an, aber ich vermute, dass Sie den zu analysierenden Code eingeben, bevor Sie einen vollständigen seriellen Befehl zur Verfügung haben. Manchmal ist also nur 1 Byte verfügbar und manchmal sind alle 3 vorhanden, daher das unvorhersehbare Verhalten.

Ich würde den ersten Test wie folgt ändern:

if (Serial.available() >= 3)

Das wartet, bis Sie einen vollständigen Befehl haben, bevor Sie alle Tests durchführen.

/j

Das funktioniert perfekt. Danke auch für die Erklärung. Ich weiß jetzt, dass es funktioniert hat, bevor die ganze Seriennachricht eingetroffen ist. So viel Kopfzerbrechen für etwas so Einfaches

Obwohl ich mit der Arduino-Programmierung nicht vertraut bin, wenn Sie eine Reihe von if-Anweisungen wie if(Serial.read() == 't') haben, dann glaube ich, dass die erste wahrscheinlich das Zeichen von der seriellen Schnittstelle verschlingt, und Im nächsten Test if(Serial.read() == '1') ist der Port leer und das Zeichen weg.

Stattdessen möchten Sie das Zeichen in einer Variablen speichern und dann die Variable testen:

ch = Serial.read (); if (ch == 't') ... sonst if (ch == '1') ...

usw.

Zugegeben, es ist nie eine gute Idee, die if-Anweisung zu lesen. Warten Sie am besten, bis ein Befehl verfügbar ist, und lesen Sie ihn in Blöcke ein, damit Sie sie in weiteren Tests wiederverwenden können. Vor allem, wenn Sie am Ende if (Serial.read() == 't') ... if (Serial.read() == 'x') .... tun, wobei der zweite Lesevorgang eine Zahl aus dem Befehl enthalten würde und nicht mehr das Befehlszeichen.