ich hoffe ihr könnt mir weiterhelfen. Ich bin wirklich am verzweifeln.
Zu meinem Problem:
Ich schicke den Befehl (1) via Visual Basic an den (Arduino Uno) und dieser schaltet anschließend meinen digitalen Ausgang auch frei. Soweit alles gut. Mit dem Befehl (2) schließt dieser den wieder. Auch das funktioniert alles.
Aber:
Wenn ich statt den befehl (1) sprich den Befehl (11) schicke dann funktioniert das nicht.
Es reagiert nur bei einstelligen Zahlen oder Buchstaben. Ich habe aber mehrere Schaltungen. Das heist ich brauche entsprechend mehrere Befehle.
Hier mal ein Beispiel:
if ((data == '1')){ // möchte hier aber zum Beispiel statt (1) die (11) haben.
digitalWrite(8, HIGH);
}
if ((data == '2')){ // // möchte hier aber zum Beispiel statt (2) die (22) haben.
digitalWrite(8, LOW);
}
Vorab schon mal danke an alle die mir einen Tip geben
Du musst einfach nur .... Serial.available() ... Serial.read() .... Buffer .... CR/LF ...
aber strncmp_P .... oder atoi wenn.... oder strtol ... wenn dann strtok.
Wenn du nicht den ganzen Kode zeigst, zeige ich auch keine ganze Antwort.
Whandall:
Warum willst du 0xFF und 0x00 einfach unterschlagen?
)
Die Werte sind zum Debuggen irrelevant, egal ob er ASCII-Einsen '1' mit Dezimalcode 49 sendet oder Steuerzeichen-Einsen mit Dezimalcode 1 oder Dezimalcode 11.
Warum willst du zwei gültige Zeichen in einem Echo-Programm unterschlagen?
Warum willst du zwei Programme benutzen um zwei Aspekte der gleichen Sache anzuzeigen?
"read() ohne available() in ein byte...", du solltest dich schämen so etwas zu posten.
ich schätze das ich mich nicht richtig ausgedrückt habe.
Also folgender Sachverhalt:
Ich habe in Visual Basic mehrere "Button" die verschiedene Befehle ausführen.
Zum Beispiel:
Button.1 schickt den Befehl "1" an den Arduino und aktiviert somit digitalWrite (4, HIGH)
Button.2 schickt den Befehl "2" an den Arduino und aktiviert somit digitalWrite (4, LOW)
Bei einstelligen Zahlen funktioniert dies auch. Aber wenn ich jetzt zum Beispiel auf
Button.3 den Befehl "11" schicke also sprich zwei stellige Zahlen dann passiert gar nichts.
Unser Kode sollte dir zeigen, welche Zeichen übertragen werden,
wenn du Zeilen (begrenzt mit CR/LF) aus mehreren Zeichen an den Arduino sendest.
Dein Kode ist mehrere Schritte von einer erfolgreichen Übersetzung entfernt.
In den Kode ist nichts eingeflossen was wir angemerkt haben.
Du musst alle Zeichen in einem Puffer sammeln bis die Zeile vollstängig ist,
dann kannst du diese Zeile verarbeiten (z.B. die Zahl aus mehreren Zeichen in einen int verwandeln).
Dazu hat dir Serenifly bereits ein vollständiges Beispiel gezeigt.
@Bermudaor: Bitte setz den Code mal in Code-Tags, dann ist es besser lesbar.
Dein Code kann so wie er gepostet ist nicht funktionieren, denn nach dem Serial.available() fehlt in dem Block noch mind. ein data = Serial.read().
Dein Grundproblem ist, das Du immer nur Zeichen übertragen kannst. Wenn Du per VisualBasic eine "1" schickst, dann wird nicht die Zahl Eins übertragen, sondern das Zeichen '1'. Du prüfst ja auch in Deinen Abfragen auf dem Arduino auf das Zeichen '1' und nicht auf die Zahl.
Wenn Du nun "11" überträgst, dann sendest Du zwei mal das Zeichen '1' und nicht die Zahl 11. Daher musst Du (vereinfacht ausgedrückt) auch 2 Zeichen einlesen. Das Problem ist natürlich zu erkennen ob jetzt zwei Mal der Befehl '1' gemeint ist, oder einmal der Befehl '11'. Daher trennt man bei solchen Übertagungen die Befehle mit einem Trennzeichen voneinander, damit man weiss wann der eine Befehl aufhört und der nächste anfängt. Was die werten Forumskollegen Dir in ihren Posts sagen wollen ist, das Du das z.B. mit einem Zeilenumbruch/Zeilenende als Trenner machen kannst.
Du kannst es Dir aber einfach machen und z.B. a-z und A-Z als einzelne Zeichen senden, dann hast Du insgesamt 62 verschiedene Möglichkeiten die Du mit je einem einzelnen Zeichen abdecken kannst.