Arduino serialEvent – recepción serial
asíncrona
La función de Arduino serialEvent te permite recibir datos seriales de una
forma parecida a una interrupción o de forma asíncrona. Entonces está
función sólo se ejecuta si existen datos seriales en el buffer del puerto serial.
La función de Arduino Serial Read se usa para leer a estos datos seriales. Es
importante mencionar que esta función no es asíncrona propiamente, sino
que es ejecutada en cada iteración de la función loop. Por lo tanto si la
función loop demora mucho, así será la demora de la recepción de los datos
seriales. Esta función no es compatible con el Arduino Esplora, Leonardo y
Micro.
Sintaxis de la función de Arduino serialEvent
La sintaxis de la función de Arduino serialEvent sólo requiere definir a
la función void serialEvent() después de la función loop. Entonces
dentro de esta función se puede agregar las instrucciones para la
lectura de los datos seriales mediante el seria. read. El propósito de
esta función es ejecutarse al inicio de cada iteración para la función
loop. Esto se realizará hasta encontrar un carácter del código ascii que
nos permita saber si ya se termino la transmisión. Para dicho evento,
normalmente se utilizan a los caracteres \n o \r.
Código de Ejemplo para la función de Arduino
serialEvent
El siguiente código de ejemplo, permite la recepción de caracteres numéricos
y su posterior conversión a una variable entera. Recordemos que el puerto
serial esta «transportando» bytes en forma de caracteres en código ascii.
Entonces, una vez que hemos terminado de recibir una línea que contenga
exclusivamente numeros ascii, se procede a convertirlo a una variable
entera, (int) mediante la función de Arduino atoi.
String cadenaCharEntrada = "";
char vectorChar[20];
bool finCadena = false;
void setup() {
Serial.begin(115200);
cadenaCharEntrada.reserve(20);
}
void loop() {
if(finCadena){ //Se termino de recibir una cadena completa
finCadena = false; //Permitimos volver a recibir otra cadena
cadenaCharEntrada.toCharArray(vectorChar,20); //Convertimos el string a un vectorChar
int numeroEntero = atoi(vectorChar); //Convertimos un vectorChar a un entero
Serial.print("Se recibio ");
Serial.println(numeroEntero);
cadenaCharEntrada = "";
}
}
void serialEvent(){
//Recepción de datos Seriales
while (Serial.available()) { //Si existen datos seriales, leer a todos
char CaracterEntrada = Serial.read(); //Leer 1 byte serial recibido
cadenaCharEntrada += CaracterEntrada; //Agregar el nuevo char a una cadena String
if (CaracterEntrada == '\n') {//Si el char o byte recibido es un fin de linea, activa la bandera
finCadena = true; //Si la bandera finCadena = 1, entonces la transmision esta completa
}