与arduino缓慢的串行通信?延迟将近1秒?

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

改变串口的波特率似乎并没有改变任何东西。

一些帮助将不胜感激! :)

+4

当您调用Serial.readString()时,您不检查是否有任何可读的内容。您发现Serial.setTimeout()的默认值是1000毫秒。 –

的解决办法是设置:

Serial.setTimeout(50) 

谢谢大家!

+0

感谢一群伙伴! –

+0

https://www.arduino.cc/en/Serial/SetTimeout –

当您从串行监视器发送一个字符串时,它会逐个发送所有字符串。所以如果你发送'LEDON',它将连续传送5个字符。这就是为什么它需要一些时间来执行。

+0

更重要的是,它会一次一位地传输每个字符(它由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()函数中。