dentro de la int rda mejor lees caracter a caractec (queda tiempo entre ellos para hacer otras cosas
)
no pares la int, no hace falta.
a grandes rasgos puedes hacer esto...
para optimizar localiza en la int rda el caracter inicio de tu cadena... veras como asi te funciona sin el errors..
struct _comm
{
int16 paquetes_rx; //numero de paquetes recibidos desde inicio
int16 paquetes_tx; //numero de paquetes transmitidos
int16 errores; //numero de errores de comunicacion
int1 nuevo_paquete; //hay un nuevo paquete a analizar
int8 cuenta_rx; //caracteres recibidos en el ultimo paquete
int8 cuenta_tx;
int8 datos_tx;
char trama[50];
int1 ocupado;//flag que indica si estamos procesando un paquete
char bite; //caracter dummy, para sacar del puerto serie
} comm;
/***********************************************************
* interrupcion de recepcion completa del paquete *
***********************************************************/
#int_TIMER1
TIMER1_isr()
{
disable_interrupts(int_TIMER1);
comm.ocupado=1;
comm.nuevo_paquete=1; // tenemos un paquete a la espera
++comm.paquetes_rx; // Paquetes recibidos
}
/***********************************************************
* interrupcion de recepcion completa del paquete *
***********************************************************/
#int_rda
void serial_isr()
{
comm.bite=getc(); //contenedor temporal
if (!comm.ocupado) //si estamos procesando un envió no se hace caso..
{
comm.trama[comm.cuenta_rx]=comm.bite;
comm.cuenta_rx++;
set_timer1(20000); // esperar el tiempo que deseemos como timeout
clear_interrupt(int_TIMER1); // limpiar el flag de overflow del timer1
enable_interrupts(int_TIMER1);
}
}
en tu main...
if (comm.nuevo_paquete)
{
// tienes un paquete esperando de "comm.cuenta_rx" bytes de tamaño
// en el array "comm.trama"
//haces lo que quieras con el
//liberar la recepcion
comm.ocupado=0;
comm.nuevo_paquete=0;
comm.cuenta_rx=0;
}