Meno male che ti ho chiesto di mostrarmi l'inizio della routine che intercetta i dati.
Il problema è dovuto al fatto che la routine impegna per troppo tempo il micro che diventa sordo ad altre richieste di interrupt come ad esempio quelle in ricezione sulla seriale, cioè di perdi dati.
Se vuoi usare ancora la funzione attuale la devi ridurre a:
Ricevi dato, metti in buffer e fine.
Il buffer poi lo consumi nel loop.
Puoi usare un ring buffer con start buffer e end buffer dinamici, cioè entra un nuovo dato messo in coda e endBuffer++, consumi un dato è startBuffer++;
Ciao.