2015-09-06 405 views
5

只是嘗試了一些東西,因爲我想用我的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毫秒。 –

回答

11

的解決辦法是設置:

Serial.setTimeout(50) 

謝謝大家!

+0

感謝一羣夥伴! –

+0

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

-1

當您從串行監視器發送一個字符串時,它會逐個發送所有字符串。所以如果你發送'LEDON',它將連續傳送5個字符。這就是爲什麼它需要一些時間來執行。

+0

更重要的是,它會一次一位地傳輸每個字符(它由8位組成)!它甚至增加了2個控制位(開始和停止),所以它需要50個時鐘週期來傳送它!但是......等等......這就是串行通信的工作原理!在9600比特/秒的50個循環意味着大約5毫秒。這裏的原因顯然不是串行通信串行發送數據的事實... – frarugi87

1

在我看來,以提高你的程序,你必須修改代碼爲:

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()函數中。