miércoles, 1 de junio de 2016

Arduino interpretar comandos del puerto serie

El otro día me encontre este código el cual lo estoy utilizando como referencia para pasar he interpretar comandos por el puerto serial.

Comandos por serie:
/*Código creado por Castig para Taringa (14-04-2013).*/ 
int numChar = 0; //Numero ASCII del caracter. 
char incomingByte = 0;   // informacion entrante (RX) 
int cantPalabras = 1; //Cantidad de palabras que se ingresan (el espacio separa las palabras)
String palabra1 = ""; //Palabra 1 que se ingresa 
String palabra2 = ""; //Palabra 2 que se ingresa 
String palabra3 = ""; //PUEDEN AGREGAR TODAS LAS PALABRAS QUE QUIERAN. 

boolean datosAnalizados = false; //Indica si se termino de recorrer la palabra entrante.

boolean ledPrendido = false; //Indico si el LED se encuentra prendido. 
int pinLed = 13; //pin del LED. Por lo general el pin 13 es donde está el LED que viene integrado en la placa Arduino.

void setup() { 
    Serial.begin(9600); // Abre el puerto serial a 9600 bps 
    pinMode(pinLed, OUTPUT); //Indico que el pin 13 es un puerto de salida void loop(){ 
    while (Serial.available()>0){ 
        numChar = Serial.read();//codigo numerico ASCII del caracter 
        incomingByte = numChar; //transformo el numero en el caracter ASCII  

        //Uso el caracter 32 (espacio) como delimitador de palabras. 
        if (numChar==32){ 
            cantPalabras++; //Cuando encuentro un espacio, indico que se analizara la próxima palabra.
        } 

        /* El caracter 13 corresponde al retorno de carro. 
           El caracter 10 es el salto de línea. 
           El caracter 32 es el espacio. 
           Por lo general se utilizan los caracteres 13 10 para marcar el fin de línea, y equivalen a la tecla ENTER de Windows.
           Por lo tanto, me fijo que el caracter analizado no sea ni 13, 10 o 32*/
        if (numChar!=13 && numChar!=10 && numChar!=32){ 
             
            /*Me fijo que palabra estoy analizando*/ 
            if(cantPalabras==1){ 
                palabra1 = palabra1+incomingByte; //Voy agregando los caracteres leidos a la palabra1 para formarla.
            } 
            if(cantPalabras==2){ 
                palabra2 = palabra2+incomingByte; //Voy agregando los caracteres leidos a la palabra2 para formarla.
            } 
        } 
        if (numChar==10){ 
            datosAnalizados = true; //Esto indica que se analizaron datos 
        } 
    }     
     
    /*Cuando detecto que ya no hay nada para analizar, 
    pero hay datos analizados, procedo a transmitirlos. 
    */ 
    if (Serial.available() <=0 && datosAnalizados==true) { 
        datosAnalizados = false; //Indico que ya no hay datos analizados, ya que los analizé previamente.

        /*Convierto todas las palabras en mayúscula para facilitar la interpretación, pero esto es opcional.*/
        palabra1.toUpperCase(); 
        palabra2.toUpperCase(); 

        //Llamo a la función 'commandInterpreter' y le paso las palabras. Esta función se encargará de interpretar los comandos.
        commandInterpreter(palabra1,palabra2); 

        //Reestablezco el valor de las variables para que puedan ser utilizadas nuevamente.
        palabra1 = ""; 
        palabra2 = ""; 
        cantPalabras = 1; 
        Serial.flush();//Vacío el buffer del puerto serie para evitar leer valores ya leidos.
    } 
     
    if (ledPrendido == true) 
    { 
        digitalWrite(pinLed, HIGH);   // prendo el LED 
    } 
    else 
    { 
        digitalWrite(pinLed, LOW);    // apago el LED 
    } 
} 


//Función que analiza e interpreta los comandos 
void commandInterpreter(String comando1, String comando2){ 
         
        //Me fijo que el comando 1 no esté vacío. 
    if (comando1 != ""){ 
        if (comando1 == "PRENDER") 
        { 
            if(comando2 == "LED") 
            { 
                ledPrendido = true; 
                Serial.println("LED PRENDIDO"); 
            } 
            else 
            { 
                Serial.println("COMANDO 2 INVALIDO"); 
            } 
        } 
         
        if (comando1 == "APAGAR") 
        { 
            if(comando2 == "LED") 
            { 
                ledPrendido = false; 
                Serial.println("LED APAGADO"); 
            } 
            else 
            { 
                Serial.println("COMANDO 2 INVALIDO"); 
            } 
        } 
         
        if (comando1 != "PRENDER" && comando1 != "APAGAR") 
        { 
            Serial.println("COMANDO 1 INVALIDO"); 
        } 
    } 
} 


Fuente: http://www.taringa.net/posts/hazlo-tu-mismo/16609621/Arduino-Comunicacion-Serial-e-interpretar-comandos.html

No hay comentarios:

Publicar un comentario