Arduino 遥控器 - 奇怪的串口输出

Arduino remote control - strange serial output

我为我的 Arduino Nano 3.0 编写了一些代码,如果我通过 USB 集线器发送 1,我想让 LED 闪烁。它有效,但我不明白 Nano 的输出,我希望有人能向我解释一下。

这是我的代码:

#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);
    }
}

这是输出:

-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

在程序一开始我收到一个 -1 ???这是因为 USB 连接还是我做错了什么?

此代码未按照您的想法运行。特别是,您编写的循环代码表示:

  1. 如果串行缓冲区中有东西,那么如果Go是1个闪烁
  2. 否则关闭 LED。

在设置中,您清除缓冲区。因此,您将需要队列中的另一个字符来触发操作。

看你写的,我觉得你想做的是

  1. 如果我写了一个 1 然后闪烁
  2. 如果我写了0,就停止
  3. 如果我写了其他东西......你没有指定,但我会忽略这个命令

为此,您需要这样的东西:

#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);
    }
}

而且拖延是一个非常糟糕的习惯;您不想等待两秒钟才能看到正确的输出。为了摆脱延迟,您可以按照 BlinkWithoutDelay 示例中的示例进行操作:

#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);
    }
}

免责声明:此代码未经测试;里面可能有一些bug