Lo ideal es crearte un buffer de recepcion de unos 50 byte tipo
char bufferRdx[50]; y luego asignar la recepcion de datos a la interrupcion de recepcion dentro de esta interrupcion vas guardando los datos recibidos en el buffer e incrementando un contador con tope hasta el tamaño del buffer .
Fuera de la funcion de recepcion lees el contador si es distinto de cero sacas datos del buffer y restas el numero de datos sacados al contador.
En codigo serial algo asi:
//Variables Globales
char rdxUartbuffer[50];
char rdxUartcounter;
char *prdxUartpointer;
//Prototipos
#separate void UartResetBuffer(void);
#separate char UartLenBuffer(void);
#separate signed char UartReadChar(void);
//Funciones
//Reset Buffer Rdx
#separate void UartResetBuffer(void)
{
rdxUartbuffer[0] = 0;
prdxUartpointer = rdxUartbuffer;
rdxUartcounter = 0;
}
//Informa cuantos datos estan esperando en el buffer USO OPCIONAL
#separate char UartLenBuffer(void)
{
return rdxUartcounter;
}
//Lee datos del buffer
#separate signed char UartReadChar(void)
{
signed char temp;
if(rdxUartcounter)
{
temp = (signed char) rdxUartbuffer[0];
memcpy(rdxUartbuffer,rdxUartbuffer+1,sizeof(rdxUartbuffer));
prdxUartpointer--;
rdxUartcounter--;
}
else
{
UartResetBuffer();
return -1; // no hay mas datos
}
return temp;
}
// Control Interrupcion RDX
#INT_RDA
void UartRdxHandle(void)
{
char temp;
temp = getc();
if(rdxUartcounter < sizeof(rdxUartbuffer))
{
*prdxUartpointer = temp;
prdxUartpointer++;
rdxUartcounter++;
}
}
//Principal
void main (void)
{
UartResetBuffer();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
//bla..blabla resto de tu codigo
}