2017-11-03 1 views
0

Ich schrieb ein wenig Code für meine Arduino Nano 3.0 und ich möchte eine LED blinken lassen, wenn ich eine 1 über den USB-Hub senden. Es funktioniert, aber ich verstehe die aus dem Nano gemachten Ergebnisse nicht und hoffe, dass mir jemand das erklären kann.Arduino Fernbedienung - seltsame serielle Ausgabe

Hier ist mein Code:

#define LEDPIN 2 
#include <SPI.h> 

int Go = 0; 

void setup() { 

    Serial.begin(9600); 
    pinMode(LEDPIN, OUTPUT); 
    digitalWrite(LEDPIN, LOW); 
    delay(1000); 
    digitalWrite(LEDPIN, HIGH); 
    delay(1000); 
    digitalWrite(LEDPIN, LOW); 

    while (Go != 1){ 
    Go = Serial.read(); 
    Serial.println(Go);   //a 1 will print 49, a 0 should print 48 
    Go = (Go - '0'); 
    Serial.println(Go); 
    } 
} 

void loop() { 

    if (Serial.available() > 0){ 
    if (Go == 1) 
    { 
     delay(1000); 
     digitalWrite(LEDPIN, HIGH); 
     delay(1000); 
     digitalWrite(LEDPIN, LOW); 
    } 
    else {} 
    } 
    else 
    { 
    digitalWrite(LEDPIN, LOW); 
    } 
} 

Und dies ist die Ausgabe:

-1 //this should be a 0 
-49 
. 
. 
. 
49 //this is because of ASCII 
1 // here is my 1 but the programm won't do the stuff in loop() 
    // instead I have to send another 1 to get LED fun 

Bereits zu Beginn des Programms ich ein -1 empfangen ??? Liegt das an der USB-Verbindung oder mache ich etwas falsch?

+2

1) wir sind leider kein Debugging-Service, 2) -1 von 'Serial.read()' bedeutet, dass keine Daten verfügbar sind, sollten Sie 'Serial.available()' verwenden Um zu überprüfen, ob Daten verfügbar sind, siehe https://www.arduino.cc/en/Serial/Read – Gizmo

+0

In der 'setup' Funktion lesen Sie die serielle Leitung, ohne dass Sie auf die Datenverfügbarkeit warten (' Serial.available() '). –

+0

Ich habe versucht 'Serial.available()', aber in diesem Fall wird es einfach nicht funktionieren. Es würde nicht einmal das erste 'Go' drucken – Tim

Antwort

0

Dieser Code tut nicht, was Sie denken, dass es ist. Insbesondere schrieb man die Schleife Codemittel:

  1. wenn es etwas in den seriellen Puffer ist, dann, wenn Go 1 blinken
  2. sonst die LED auszuschalten.

Im Setup löschen Sie den Puffer. Folglich benötigen Sie ein anderes Zeichen in der Warteschlange, um die Aktion auszulösen.

Von dem, was Sie geschrieben haben, ich glaube, was Sie

ist
  1. , wenn ich eine 1, dann blinken schrieb
  2. , wenn ich eine 0 geschrieben, dann stoppen
  3. wenn ich etwas anderes geschrieben tun wollte. .. Sie nicht angegeben haben, aber ich werde diesen Befehl

um dies zu tun, ignorieren, würden Sie so etwas wie dies wollen:

#define LEDPIN 2 
// #include <SPI.h> Not needed here 

byte Go = 0; // Please, use the correct size for variables 

void setup() { 
    Serial.begin(9600); 
    pinMode(LEDPIN, OUTPUT); 
    digitalWrite(LEDPIN, LOW); 
    delay(1000); 
    digitalWrite(LEDPIN, HIGH); 
    delay(1000); 
    digitalWrite(LEDPIN, LOW); 

    Go = 0; 
} 

void loop() { 
    if (Serial.available() > 0){ 
     // Something was received, so let's check it out 
     byte tempGo = Serial.read(); 
     Serial.println(Go);   //a 1 will print 49, a 0 should print 48 

     // this way if you did not receive any valid char nothing will change 
     if (tempGo == '0') 
      Go = 0; 
     else if (tempGo == '1') 
      Go = 1; 

     Serial.println(Go); 
    } 

    if (Go){ 
     delay(1000); 
     digitalWrite(LEDPIN, HIGH); 
     delay(1000); 
     digitalWrite(LEDPIN, LOW); 
    }else{ 
     digitalWrite(LEDPIN, LOW); 
    } 
} 

Außerdem sind die Verzögerungen eine wirklich schlechte Angewohnheit; Sie möchten nicht zwei Sekunden warten, bevor Sie die korrekte Ausgabe sehen. Um die Beseitigung der Verzögerungen zu erhalten, können Sie das Beispiel aus dem BlinkWithoutDelay Beispiel folgen:

#define LEDPIN 2 
// #include <SPI.h> Not needed here 

byte Go = 0; // Please, use the correct size for variables 
unsigned long prevMillis; 

void setup() { 
    Serial.begin(9600); 
    pinMode(LEDPIN, OUTPUT); 
    digitalWrite(LEDPIN, LOW); 
    delay(1000); 
    digitalWrite(LEDPIN, HIGH); 
    delay(1000); 
    digitalWrite(LEDPIN, LOW); 

    Go = 0; 
} 

void loop() { 
    if (Serial.available() > 0){ 
     // Something was received, so let's check it out 
     byte tempGo = Serial.read(); 
     Serial.println(Go);   //a 1 will print 49, a 0 should print 48 

     // this way if you did not receive any valid char nothing will change 
     if (tempGo == '0') 
      Go = 0; 
     else if (tempGo == '1') { 
      if (!Go) prevMillis = millis() - 1000; // This is in order to flash immediately 
      Go = 1; 
     } 

     Serial.println(Go); 
    } 

    if (Go){ 
     while ((millis() - prevMillis) >= 1000){ 
      prevMillis += 1000; 
      digitalWrite(LEDPIN, !digitalRead(LEDPIN)); 
     } 
    }else{ 
     digitalWrite(LEDPIN, LOW); 
    } 
} 

HAFTUNGSAUSSCHLUSS: Dieser Code ist nicht getestet; Es kann einige Bugs geben innerhalb

+0

danke! aber kann ich dir eine frage stellen? warum nicht zögern? frieren sie das ganze Programm ein? Ich bin neu zu Arduino Progamming BTW – Tim

+0

@Tim, das ist genau der Grund. Wenn Sie die Verzögerungsfunktion eingeben, dürfen Sie nur nach Ablauf dieser Zeit beenden (ignorieren Sie Interrupts). Du kannst es versuchen; Sie werden feststellen, dass das Programm den Befehl erst nach Abschluss bearbeitet (also einmal alle zwei Sekunden). Im zweiten Fall reagiert das Programm (fast) sofort, da es fortlaufend den seriellen Puffer abfragt. Verzögerungen sind selten sinnvoll, es sei denn, Sie möchten das Programm explizit sperren – frarugi87