07. COMUNICACIÓN CON EL EXTERIOR II

RECIBIENDO MENSAJES  A TRAVÉS DEL PUERTO SERIE

.
Hasta ahora solo hemos enviado mensajes desde Arduino hacia el PC, ¿Pero como recibimos mensajes en Arduino?

En primer lugar disponemos de una función llamada Serial.parseInt() que nos entrega lo que se escribe en el monitor serie convertido a entero:
     void loop()                                    
          { 
              if (Serial.available() > 0)
                  {
                      int x = Serial.parseInt();
                      Serial.println ( x) ;
                  }
          }




Este programa simplemente recibe en x los números que nos tecleen en la consola (cuando pulsemos intro) y si es un texto, lo interpreta como cero.
Hemos utilizado otra función de Serial : Available() que es un booleano. Conviene por costumbre comprobar que antes de leer el puerto serie hay algo que nos han enviado.  Si lo hay Available() es True y en caso contrario es False.
Para leer un String del puerto serie tenemos que complicarnos un poco más y hablar del tipo char.
Uno de de las mayores quebradero de cabeza al iniciarse en C++ es comprender la diferencia, anti-intuitiva, entre char y String. char es un tipo que representa un único carácter y se define con comillas simples, a diferencia de String que necesita comillas dobles:

char  c = ‘a’  ;
String s =”a”  ;
Aunque parezca lo mismo para C++ son muy distintos.
Para leer una cadena desde el puerto serie necesitamos leer un carácter cada vez y después montar un String a partir de ellos, pero antes, asegúrate de seleccionar ambos NL & CR en la parte inferior del monitor serie, para garantizar que se envía el carácter de fin de línea:
Seleccion de ajuste de linea

Un programa para leer la consola sería algo así:


     void setup()
            { Serial.begin(9600); }
 
     void loop ()
          { 
              char c = ' ' ;
              String mensaje ="" ;
              if (Serial.available()) //Comprobamos si hay algo esperando
                   {
                      while( c != '\n') //Si lo hay, lo leemos hasta el intro
                          { 
                            mensaje = mensaje + c ; // Añadimos lo leído al mensaje
                            c = Serial.read(); //Leer 1 carácter
                            delay(25);
                          }
                      Serial.println( mensaje); //Al salir imprimir el mensaje
                      mensaje = "" ; //Bórralo para la próxima vez
                   }
          }

Aquí usamos otra instrucción de C++ llamada while. Es similar a if, Ejecuta repetidamente  el bloque que le sigue mientras se cumpla la condición que le pasamos entre paréntesis:


Cuando lee el intro final de lo que escribimos, La condición c != ‘\n’ se torna falso y sale del while.
Por lo demás, comprobamos si hay algo disponible en la puerta serie y de ser así montamos el mensaje leyendo un char cada vez y sumándoselo a mensaje para construir un String que podamos imprimir al salir.
  
     while ( condición)
                 {   ……… }
El motivo del delay(25) es que a una velocidad tan lenta, enviar un char de 8 bits por la puerta serie, tarda mucho más de lo que tarda Arduino en ejecutar las instrucciones del while y volver a empezar. Por eso si se suprime el delay (y os recomiendo la prueba) leerá un carácter bueno (de la palabra escrita y como 10 caracteres basura para un Arduino UNO o Mega).
Si subimos la velocidad de comunicación a 115200 bits por segundo, comprobareis que no hay este problema ya que al multiplicar la velocidad de envío por más de 10 Arduino ya no tiene tiempo de volver a por más caracteres antes de que lleguen.


Comentarios