2012-05-04 19 views
5
#include <stdio.h> 

#define LED 13 

void setup() { 
    pinMode(LED, OUTPUT); 
    Serial.begin(9600); 
} 

void loop() { 
    int i; 
    char command[5]; 
    for (i = 0; i < 4; i++) { 
    command[i] = Serial.read(); 
    } 
    command[4] = '\0'; 

    Serial.println(command); 

    if (strcmp(command, "AAAA") == 0) { 
    digitalWrite(LED, HIGH); 
    Serial.println("LED13 is ON"); 
    } else if (strcmp(command, "BBBB") == 0) { 
    digitalWrite(LED, LOW); 
    Serial.println("LED13 is OFF"); 
    } 
} 

Estoy tratando de leer una cadena de 4 caracteres de largo con Arduino's Serial, y cuando es AAAA encender un LED, cuando es BBBB apague la serie.Arduino cadena de lectura de la serie

Sin embargo, cuando ingreso "AAAA" se lee "AAAÿ" con muchos "ÿ" en el camino.

Creo que estoy leyendo todo correctamente, pero no está funcionando tan bien, ¿hay alguna idea de lo que estoy haciendo mal?

+0

Compruebe que la velocidad en baudios, bits de parada, control de flujo, y la paridad son idénticas en ambos extremos. Incluso si "sabes que es verdad", tómate los 3 minutos y verifícalo. Ahórrese horas. –

+0

¿Cuál es su código 'Serial.begin()'? – qwertz

+0

Es 9600, también lo publiqué. –

Respuesta

1
#define numberOfBytes 4 
char command[numberOfBytes]; 

    void serialRX() { 
     while (Serial.available() > numberOfBytes) { 
     if (Serial.read() == 0x00) { //send a 0 before your string as a start byte 
      for (byte i=0; i<numberOfBytes; i++) 
      command[i] = Serial.read(); 
     } 
     } 
    } 
1

Debe comprobar que haya algo disponible para leer. De lo contrario, el read() devolverá -1. Puede usar Serial.available() para verificar el buffer de lectura.

9
String txtMsg = ""; 
char s; 

void loop() { 
    while (serial.available() > 0) { 
     s=(char)serial.read(); 
     if (s == '\n') { 
      if(txtMsg=="HIGH") { digitalWrite(13, HIGH); } 
      if(txtMsg=="LOW") { digitalWrite(13, LOW); } 
      // Serial.println(txtMsg); 
      txtMsg = ""; 
     } else { 
      txtMsg +=s; 
     } 
    } 
} 
1

Se lee 'Y' porque no hay carbón para leer en la memoria intermedia. Los otros personajes tardan un tiempo en desapilarse del buffer uart. Entonces, no puedes hacer un ciclo para leer caracteres. Tienes que esperar que otro personaje esté disponible antes de leerlo.

Además, esta forma de esperar caracteres no es la mejor manera porque bloquea el ciclo principal.

Aquí es lo que hago en mis programas:

String command; 

void loop() 
{ 
    if(readCommand()) 
    { 
     parseCommand(); 
     Serial.println(command); 
     command = ""; 
    } 
} 

void parseCommand() 
{ 
    //Parse command here 
} 

int readCommand() { 
    char c; 
    if(Serial.available() > 0) 
    { 
     c = Serial.read(); 
     if(c != '\n') 
     {  
      command += c; 
      return false; 
     } 
     else 
      return true; 

    } 
} 
Cuestiones relacionadas