// Programa de prueba para ver el funcionamiento del
// módulo GPS, GM20 de SkyLAB.
// Programador: Moyano Jonathan.
// Año: 2012.
// Incluimos las librerías necesarias.
#include "Plantilla_PIC18F4520.c"
#include "stdlib.h"
// Constantes.
// Variables globales.
char data=0x00;
int const lenbuffGPS=65; // Tamaño del buffer de recepción GPS.
int8 cbuffGPS[lenbuffGPS]; // Buffer de recepcion de datos serie GPS.
int8 auxGPS[15];
int8 p1, p2;
int8 hora=0x00;
int8 minutos=0x00;
int8 segundos=0x00;
float latitud=0.00000;
char direccion_NS=0x00;
float longitud=0.00000;
char direccion_EO=0x00;
int8 dia=0x00;
int8 mes=0x00;
int16 anio=0x00;
int8 xbuff=0x00;
// Declaración de funciones.
int8 StrFnd(char *s, char c, size_t st);
char* StrnmCpy(char *s1, char *s2, size_t n, size_t m);
// Gestión de interrupciones.
void main()
{
while(true){
if(kbhit(GPS)) // Si hay datos disponibles del puerto serie...
{
data=getchar(GPS);
switch(data)
{
case 10:
// Si llegó el caracter de fin de línea..
// Determinamos si hay una trama $GPRMC válida..
if(cbuffGPS[0]=='$' && cbuffGPS[1]=='G' && cbuffGPS[2]=='P' && cbuffGPS[3]=='R' && cbuffGPS[4]=='M' && cbuffGPS[5]=='C' && cbuffGPS[18]=='A' ){
// fprintf(DEBUG,"%s \r\n\n",cbuffGPS); // Imprimimos la trama $GPRMC completa.
// Indicador de trama válida recibida.
LED_VERDE_OK_ON
delay_ms(200);
LED_VERDE_OK_OFF
// Decodificación de los datos de hora,fecha,latitud y longitud.
// Delimitamos el primer dato.
p1 = StrFnd(cbuffGPS, ',', 0); // Determinamos donde está la primera coma.
p2 = StrFnd(cbuffGPS, ',', p1+1); // Determinamos donde está la siguiente coma.
// Determinamos la hora UTC.
hora = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+1, p1+2));
minutos = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+3, p1+4));
segundos = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+5, p1+6));
// Imprimimos la hora UTC.
fprintf(DEBUG,"\r\nHora UTC:\%02d:\%02d:\%02d\r\n", hora,minutos,segundos);
// Delimitamos el segundo dato.
p1 = StrFnd(cbuffGPS, ',', p2+1); // Determinamos donde está la tercer coma.
p2 = StrFnd(cbuffGPS, ',', p1+1); // Determinamos donde está la cuarta coma.
// Tomamos el valor de latitud y dirección.
latitud = atof(StrnmCpy(auxGPS, cbuffGPS, p1+1, p2-1));
direccion_NS = cbuffGPS[p2+1];
// Imprimimos el valor de latitud y dirección.
fprintf(DEBUG,"Latitud:%f,DIR:%c\r\n",latitud,direccion_NS);
// Delimitamos el tercer dato.
p1 = StrFnd(cbuffGPS, ',', p2+1); // Determinamos donde está la quinta coma.
p2 = StrFnd(cbuffGPS, ',', p1+1); // Determinamos donde está la sexta coma.
// Tomamos el valor de longitud y dirección.
longitud = atof(StrnmCpy(auxGPS, cbuffGPS, p1+1, p2-1));
direccion_EO = cbuffGPS[p2+1];
// Imprimimos el valor de longitud y dirección.
fprintf(DEBUG,"Longitud:%f,DIR:%c\r\n",longitud,direccion_EO);
// Delimitamos el último dato.
p1 = StrFnd(cbuffGPS, ',', p2+12); // Determinamos donde está la última coma.
// Tomamos el valor de la fecha.
dia = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+1, p1+2));
mes = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+3, p1+4));
anio = atoi(StrnmCpy(auxGPS, cbuffGPS, p1+5, p1+6));
// Imprimimos la fecha.
fprintf(DEBUG,"Fecha:\%02d/\%02d/\%02lu\r\n\n",dia,mes,anio);
}
break;
default:
if(data=='$'){xbuff=0;} // Si llega una trama válida, resetea el contador.
cbuffGPS[xbuff++]=data; // Caso contrario, sigue leyendo datos y los agrega al buffer.
if(xbuff>(lenbuffGPS-1))
xbuff=lenbuffGPS;
break;
}
}
}
}
int8 StrFnd(char *s, char c, size_t st)
{
int8 l;
for (l=st, s+=st ; *s != '\0' ; l++, s++)
if (*s == c)
return l;
return -1;
}
char* StrnmCpy(char *s1, char *s2, size_t n, size_t m)
{
int8 i;
char *s;
for (s=s1, i=n, s2+=n; i<=m; i++)
*s++ = *s2++;
*s = '\0';
return s1;
}