2015-09-06 44 views
5

Sto provando solo alcune cose, dato che voglio usare il mio Arduino Nano come interfaccia per il mio computer con un paio di LED e pulsanti. Quindi ho bisogno di inviare alcuni comandi e dati ad Arduino dal mio PC. Tuttavia trovo la comunicazione seriale di Arduino piuttosto lenta. Infatti, dal momento in cui preme Invio per inviare il mio comando nel monitor seriale, ci vuole quasi un secondo prima che il comando esegua (in questo caso per controllare un LED).Comunicazione seriale lenta con arduino? Latenza di quasi 1 sec?

Si tratta di una limitazione o posso accelerarlo in qualche modo?

Ecco il mio codice semplice:

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

Cambiare la velocità di trasmissione della serie non sembra cambiare nulla.

Qualche aiuto sarebbe apprezzato! :)

+4

Non si sta verificando se c'è qualcosa da leggere quando si chiama Serial.readString(). Hai scoperto che il valore predefinito per Serial.setTimeout() è 1000 millisecondi. –

risposta

11

soluzione era quella di impostare:

Serial.setTimeout(50) 

Grazie a tutti!

+0

Grazie amico compagno! –

+0

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

-1

Quando si invia una stringa dal monitor di serie, invia tutte le stringhe uno per uno. Quindi, se invii "LEDON", trasferirà 5 caratteri uno alla volta in serie. Ecco perché ci vuole un po 'di tempo in esecuzione.

+0

Ancora di più, trasferirà ogni carattere (che è composto da 8 bit) un bit alla volta! E aggiunge addirittura 2 bit di controllo (start e stop), quindi richiede 50 cicli di clock per trasferirlo! Ma ... aspetta ... È così che funzionano le comunicazioni seriali! 50 cicli a 9600 bit/s significa circa 5 ms. Il motivo qui non è ovviamente il fatto che la comunicazione seriale mandi i dati in serie ... – frarugi87

1

A mio parere, per migliorare il programma, è necessario modificare il codice come:

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() 
} 

Suppongo che non c'è bisogno di contare il ciclo (non c'è alcun motivo per cui hanno a che fare , migliorando il ritardo). La funzione Serial.available() consente di verificare se le istruzioni vengono inviate solo se qualcuno invia una stringa nel monitor seriale (riducendo il ritardo). Infine, per stampare qualcosa solo una volta nel programma, è possibile inserirlo nella funzione Setup().