Mega2560 Recibir trama de 3 bytes por puerto serie 1 por interrupciones

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]);
  }
}

Agradezco alguna sugerencia!

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. :wink:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.