与arduino缓慢的串行通信?延迟将近1秒?
只是尝试了一些东西,因为我想用我的Arduino Nano作为我的电脑与几个LED和按钮的接口。所以我需要从我的电脑向Arduino发送一些命令和数据。但是我发现Arduino的串行通讯相当慢。事实上,从我按Enter键发送命令到串行监视器的那一刻起,执行命令(在这种情况下控制LED)需要几乎一秒的时间。与arduino缓慢的串行通信?延迟将近1秒?
这是一个限制,或者我可以加快它?
这里是我的简单的代码:
String cmd;
int loopNum;
int ledPin = 13;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
if(loopNum == 0) {
Serial.println("Waiting for commands"); // Only display this when sketch is initiated.
}
cmd = Serial.readString();
if(cmd == "LEDON") {
digitalWrite(ledPin, HIGH);
Serial.println("LED ON");
}
if(cmd == "LEDOFF") {
digitalWrite(ledPin, LOW);
Serial.println("LED OFF");
}
if(cmd == "HELP") {
Serial.println("Available commands:\nLEDON\nLEDOFF\nHelp");
}
loopNum++; // Counts the loop...
delay(50);
}
改变串口的波特率似乎并没有改变任何东西。
一些帮助将不胜感激! :)
的解决办法是设置:
Serial.setTimeout(50)
谢谢大家!
感谢一群伙伴! –
https://www.arduino.cc/en/Serial/SetTimeout –
当您从串行监视器发送一个字符串时,它会逐个发送所有字符串。所以如果你发送'LEDON',它将连续传送5个字符。这就是为什么它需要一些时间来执行。
更重要的是,它会一次一位地传输每个字符(它由8位组成)!它甚至增加了2个控制位(开始和停止),所以它需要50个时钟周期来传送它!但是......等等......这就是串行通信的工作原理!在9600比特/秒的50个循环意味着大约5毫秒。这里的原因显然不是串行通信串行发送数据的事实... – frarugi87
在我看来,以提高你的程序,你必须修改代码为:
String cmd;
int ledPin = 13;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
Serial.println("Waiting for commands"); // Only display this when sketch is initiated.
}
void loop() {
if (Serial.available()) {
cmd = Serial.readString(); //Assign cmd just if someone send string in serial monitor
if(cmd == "LEDON") {
digitalWrite(ledPin, HIGH);
Serial.println("LED ON");
}
if(cmd == "LEDOFF") {
digitalWrite(ledPin, LOW);
Serial.println("LED OFF");
}
if(cmd == "HELP") {
Serial.println("Available commands:\nLEDON\nLEDOFF\nHelp");
}
} //Serial.available()
}
我想,你不需要计算循环(没有理由为什么你必须这样做,改善延迟)。 使用Serial.available()函数可帮助您检查是否有人正在串行监视器中发送字符串(减少延迟)。 最后,要在程序中只打印一次,可以将其放入Setup()函数中。
当您调用Serial.readString()时,您不检查是否有任何可读的内容。您发现Serial.setTimeout()的默认值是1000毫秒。 –