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:
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
Publicar un comentario