serialEvent y retardos ?

Hola a todos, reciban mis cordiales saludos.

Hace poco estuve realizando unas pruebas de comunicación serial en Arduino y realice el siguiente código:

#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 24, 25, 26, 27);

int LED = 13;
int dato;

void setup() {
lcd.begin(16, 2);
lcd.print(“Arduino Mega”);
Serial.begin(115200);
pinMode(LED, OUTPUT);
delay(3000); // Un retardo cualquiera
}

// El lazo de control:
void loop() {
lcd.clear();
lcd.print((char)dato); // aquí supuestamente se visualizaría el último dato leído.
delay(1000); // durante un segundo.
}

// Se produce cada vez que hay un nuevo dato en el Hardware Serial
void serialEvent() {
if(Serial.available()>0) {
digitalWrite(LED, 1); // esto es opcional
dato = Serial.read(); // lee y devuelve el dato recibido
Serial.write(dato);
digitalWrite(LED, 0); // esto es opcional
}
}

Bueno haciendo uso del monitor serial, previamente configurado sin ajuste de línea (sólo para ver los datos de forma consecutiva) cada vez que ingreso un dato a la vez, “aparentemente” todo funciona muy bien.
Sin embargo cuando ingreso más de un dato como por ejemplo: 12345, me ocurre lo siguiente:

  1. El led RX de la placa se ilumina una sola vez, indicándome que todos los datos fueron enviados.
  2. El led TX de la placa se ilumina cada un segundo, devolviéndome al monitor serial número por número cada un segundo.

Alguien me podría explicar porque sucede esto ?

Saludos a todos y Gracias.

Supongo que partes de la premisa de que SerialEvent se ejecuta cada vez que llega un dato y no es así. Sencillamente se produce, por decirlo así, al final del loop si hubo un evento durante el mismo. Por lo tanto, hasta que el loop termina no se va a ejecutar tu función. Sí que existe una interrupción que se produce por cada byte recibido, pero desde el momento en que haces Serial.begin, la librería hardwareSerial se hace cargo de dicha interrupción. Si quieres interceptar las interrupciones tú mismo tendrías que hacer tu propia función para abrir el puerto.