与 arduino 的串行通信速度慢?延迟将近 1 秒?
Slow serial communication with arduino? Latency of almost 1 sec?
只是尝试一些东西,因为我想使用我的 Arduino Nano 作为我的计算机的接口,带有几个 LED 和按钮。所以我需要从我的电脑向 Arduino 发送一些命令和数据。但是我发现 Arduino 的串行通信速度很慢。事实上,从我按下 Enter 发送的那一刻起,我在串行监视器中的命令几乎需要一秒钟的时间来执行(在本例中是为了控制 LED)。
这是一个限制还是可以以某种方式加快速度?
这是我的简单代码:
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);
}
更改串口的波特率似乎没有任何改变。
一些帮助将不胜感激! :)
当你从串行监视器发送一个字符串时,它会一个接一个地发送所有的字符串。因此,如果您发送 'LEDON' 它将连续传输 5 个字符。这就是执行需要一些时间的原因。
在我看来,要改进您的程序,您必须将代码修改为:
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.setTimeout(50);
谢谢大家!
只是尝试一些东西,因为我想使用我的 Arduino Nano 作为我的计算机的接口,带有几个 LED 和按钮。所以我需要从我的电脑向 Arduino 发送一些命令和数据。但是我发现 Arduino 的串行通信速度很慢。事实上,从我按下 Enter 发送的那一刻起,我在串行监视器中的命令几乎需要一秒钟的时间来执行(在本例中是为了控制 LED)。
这是一个限制还是可以以某种方式加快速度?
这是我的简单代码:
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);
}
更改串口的波特率似乎没有任何改变。
一些帮助将不胜感激! :)
当你从串行监视器发送一个字符串时,它会一个接一个地发送所有的字符串。因此,如果您发送 'LEDON' 它将连续传输 5 个字符。这就是执行需要一些时间的原因。
在我看来,要改进您的程序,您必须将代码修改为:
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.setTimeout(50);
谢谢大家!