Deberias capturar los datos mediante el uso de interrupción,eso te facilitaría bastante las cosas y seguramente te quitará de mas de un quebradero de cabeza.
Codigo:
char caracter;
#int_rda
void recepcion_serie() // Rutina de interrupción por recepción serie
{
caracter = getc();
}
En vez de meter el dato en una variable cada vez,puedes crear un buffer y capturar varios valores antes de procesarlos y ver si te interesan o no
Dispongo de experiencia en estos temas habiendo realizado diseños de este tipo en C en ensamblador y con distintos PIC y mi opinion es realizar la adquisición por interrupción. Cuando levantas un flag indicativo de tener el string se puede desactivar la interrupción de la UART por lo que mientras comparas los valores no serás interrumpido, esa es la manera que funciona mejor. 

Pero si deseas hacerlo por scaneo no hay problema pero no lo hagas online, coge el string y luego comparalo si no SIEMPRE se te parará la UART de los PIC a veces hace esas cosas si abres, cierras escribes mientras lees etc.. por lo que yo lo arí como sigue:
Codigo:
char leer_gps()
{
char buffer[180];
gets(buffer);
return (buffer);
}
void evaluar_GPS(char *buffer)
{
// aki recorres el string trankilamente
}
Como puedes ver la adquisición es mucho mas facil, y tienes todo el tiempo para recorrer el string.
Otra cosa, verdad que no necesitas los otros parametros del GPS? tendrías que revissar los comandos NMEA y podrás hacer que solo te envie el RMS y a intervalos que desees por ejemplo cada 5 segundos, estarás más seguro con el código y consumirá menos. 

Supongo que si sabes cambiar de velocidad sabras calcular el checksum no?
De todos modos aquí va una inicialización:Codigo:
printf("$PSRF103,01,00,00,00*24
"
;
printf("$PSRF103,02,00,00,00*27
"
;
printf("$PSRF103,03,00,00,00*26
"
;
printf("$PSRF103,05,00,00,00*20
"
;
printf("$PSRF103,00,00,00,00*25
"
;
printf("$PSRF103,04,00,05,00*24
"
;
Mi GPS no tiene el WPL, recuerda que para enviar comandos se debe poner CRLF y que el GPS seguramente también los envia 