Buenas! Estoy tratando de buscar algun algoritmo eficiente para recibir 3 bytes continuos en el puerto serie 1 (no el que esta conectado al USB) utilizando interrupciones. El problema que tengo es que debo ser capaz de determinar si recibo una trama cortada (por ejemplo 2 byte) y descartarla.
El codigo que estoy usando (creado con IA) es
Serial1.begin(56000);
// Set up interrupt for serial port 1
attachInterrupt(digitalPinToInterrupt(1), serialEvent, FALLING);
// Define global variables
byte receivedBytes[3]; // array to store received bytes
int byteIndex = 0; // index for receivedBytes array
// Interrupt service routine for serial port 1
void serialEvent() {
byte receivedByte = Serial1.read(); // Read the incoming byte
receivedBytes[byteIndex] = receivedByte; // Store the byte in the receivedBytes array
byteIndex++; // Increment the byteIndex
if (byteIndex == 3) {
processBytes(receivedBytes); // Call a function to process the received bytes
byteIndex = 0; // Reset the byteIndex
}
}
void processBytes(byte bytes[]) { // Function to process the received bytes
Serial.println("Received bytes:");
for (int i = 0; i < 3; i++) {
Serial.println(bytes[i]);
}
}
La primera sugerencia es que te olvides de usar IA, al menos para temas que no dominas al grado que puedas identificar debilidades y errores que genera la “I” A. En su nivel actual, la IA generativa sirve para hacer trabajo simple, no complejo y es frecuente que genere código con errores de lógica, algunos no muy evidentes.
Una de los problemas que generó aquí es el uso Serial dentro de una rutina de servicio de interrupciones. Eso es un “no, no”.
Tu IA usa Serial intensivamente dentro de la rutina de servicio de interrupción y eso te va a dar serios problemas.
En cuanto a tu requerimiento específico ¿cómo se sabe que se recibió una trama cortada? ¿Hay que considerar un timeout? De ser así puedes tomar el tiempo desde que recibe el primer carácter y si el tercero no se ha recibido dentro de un tiempo predeterminado, tomar alguna acción (descartar los carácter es que se hayan recibido, por ejemplo) y reiniciar el conteo de caracteres
Para agregar a lo que te explica @mancera1979 , la IA comete otros dos errores.
1 - Nombra a la ISR como serialEvent() lo que no estaría mal si no fuese que serialEvent() es un nombre reservado por la IDE, y al estar declarada la función será llamada luego de terminar cada ejecución de loop() (además de las llamadas que pudieran realizarse por interrupción).
Ver https://docs.arduino.cc/built-in-examples/communication/SerialEvent/
2 - Asigna la interrupción al pin 1 siendo que ese pin corresponde a la UART0 (Serial) no a la UART1 (Serial1).
Ver pinout de la Mega
Mi sugerencia es que no uses la IA si no sabes a los problemas a los que te expones.