Pienso que no hay mejor ejemplo que los que da el PCW..

Los encuentras en la carp. examples del PICC
este es para recibir un dato.. los datos los almacena en el arreglo BUFFER_SIZE.. y cada vez que va leyendo con la funcion bgetc() lo va desocupando
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define BUFFER_SIZE 32
BYTE buffer[BUFFER_SIZE];
BYTE next_in = 0;
BYTE next_out = 0;
#int_rda
void serial_isr() {
int t;
buffer[next_in]=getc();
t=next_in;
next_in=(next_in+1) % BUFFER_SIZE;
if(next_in==next_out)
next_in=t; // Buffer full !!
}
#define bkbhit (next_in!=next_out)
BYTE bgetc() {
BYTE c;
while(!bkbhit) ;
c=buffer[next_out];
next_out=(next_out+1) % BUFFER_SIZE;
return(c);
}
void main() {
enable_interrupts(global);
enable_interrupts(int_rda);
printf("
Running...
"

;
// The program will delay for 10 seconds and then display
// any data that came in during the 10 second delay
do {
delay_ms(10000);
printf("
Buffered data => "

;
while(bkbhit)
putc( bgetc() );
} while (TRUE);
}
Espero sea de utilidad.
Adios