与arduino的慢速串行通信?大约1秒的延迟?

与arduino的慢速串行通信?大约1秒的延迟?,arduino,serial-port,Arduino,Serial Port,我只是想尝试一下,因为我想用我的Arduino Nano作为电脑的接口,带有几个LED和按钮。所以我需要从我的电脑向Arduino发送一些命令和数据。但是我发现Arduino的串行通信非常慢。事实上,从我按Enter键发送的那一刻起,我在串行监视器中的命令几乎需要一秒钟才能执行(在本例中,是为了控制LED) 这是一个限制还是可以加快速度 以下是我的简单代码: String cmd; int loopNum; int ledPin = 13; void setup() { Serial.begi

我只是想尝试一下,因为我想用我的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()
}
我认为您不需要计算循环(没有理由必须这样做,以改善延迟)。 如果有人在串行监视器中发送字符串,使用函数可以帮助您检查if语句(减少延迟)。 最后,要在程序中只打印一次内容,可以将其放入函数中。

解决方案是设置:

Serial.setTimeout(50)

谢谢大家

调用Serial.readString()时,您没有检查是否有任何内容可读取。您发现Serial.setTimeout()的默认值是1000毫秒。更重要的是,它将一次传输一位字符(由8位组成)!它甚至增加了2个控制位(开始和停止),因此需要50个时钟周期来传输它!但是等待串行通信就是这样工作的!9600位/秒的50个周期意味着大约5毫秒。这里的原因显然不是串行通信串行发送数据的事实。。。