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 
-   
- } 
-   
-   
-   
-