Yo utilizo el DMA para esos casos .... utilizo en este caso un buffer circular ... ahora tengo dos contadores (punteros): uno que cuenta los bytes que ingresan (RW) y otro que cuenta los bytes leidos (RR).
Cada vez que ingresa un byte RW incrementa. Esto mediante la interrupcion de RX, en esta interrupcion no leo el byte solo incremento RW, el byte se guarda automaticamente en la pila por medio del DMA. Tambien, cada vez que leo un byte RR incrementa. Si leo strings RR aumenta de acuerdo al tamaño del string.
Ahora el problema de aplicaciones con tramas muy grandes la solucioné con un RTOS. Cree una tarea que consulta RR y RW cada 10ms, si RR=RW no hay bytes en pila. Si RW > RR significa que hay uno o mas datos.
Otro problema es cuantos bytes debo leer.!! Para ello establecí un protocolo. Cuando envio una trama desde la PC al PIC: el primer byte indica la orden, comando o funcion que deseo realizar, el segundo byte indica el tamaño total de la trama, el tercer y resto de bytes son los datos, los ultimos 2 bytes son un checksum.
Entonces si RW > RR se lee el primer byte y lo guardo en un registro llamado COMANDO, luego espero nuevamente a que RW > RR, en este lapso el RTOS me permite hacer otra cosa con el micro. Cuando RW > RR leo el byte de tamaño (recuerda que a tarea entra cada 10ms), aqui espero el tiempo adecuado para recibir el resto de la trama. Nuevamente, el RTOS me permite hacer otra cosa mientras espero la trama de datos.
Pasado el tiempo de espera, leo nuevamente RW y RR, si la diferencia es igual al tamaño indicado, leo la trama y la guardo en una pila tempora creada en memoria dinámica y luego la proceso segun sea la funcion establecida por el primer byte (COMANDO).
Claro, hay tiempos de espera por si se falla la comunicación o algo parecido. Tambien hay confirmaciones, cuando recibo el primer byte, se lee, se guarda y se envia a la PC como confirmacion de recibido; procesada la trama se envia a la PC un caracter de que se recibio bien la trama, si el checksum no coincide se envia otro caracter indicando un error, etc, etc, etc.
Saludos