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 连接还是我做错了什么?
此代码未按照您的想法运行。特别是,您编写的循环代码表示:
- 如果串行缓冲区中有东西,那么如果Go是1个闪烁
- 否则关闭 LED。
在设置中,您清除缓冲区。因此,您将需要队列中的另一个字符来触发操作。
看你写的,我觉得你想做的是
- 如果我写了一个 1 然后闪烁
- 如果我写了0,就停止
- 如果我写了其他东西......你没有指定,但我会忽略这个命令
为此,您需要这样的东西:
#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
我为我的 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 连接还是我做错了什么?
此代码未按照您的想法运行。特别是,您编写的循环代码表示:
- 如果串行缓冲区中有东西,那么如果Go是1个闪烁
- 否则关闭 LED。
在设置中,您清除缓冲区。因此,您将需要队列中的另一个字符来触发操作。
看你写的,我觉得你想做的是
- 如果我写了一个 1 然后闪烁
- 如果我写了0,就停止
- 如果我写了其他东西......你没有指定,但我会忽略这个命令
为此,您需要这样的东西:
#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