Hola a tod@s:
Ya puedo leer los datos del GPS y sigo adelante con mi programa, pero tengo un pequeño problema.
Este es el programita:
#INCLUDE <16F876.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=16000000)
#use RS232 BAUD=4800,RCV=PIN_C7,PARITY=N,BITS=8,XMIT=PIN_C6)
#include "miLCD.c"
#include <string.h>
#include <stdlib.h>
//DEFINICION DE FUNCIONES
void leer_gps();
//VARIABLES GLOBALES
struct
{
char hora_utc[7];
char estado;
int8 lat_g;
float lat_m;
char lat_ns;
int8 lon_g;
float lon_m;
char lon_ew;
float velo;
float track_angle;
char fecha[7];
}gps;
//////////////////////////// INICIO PROGRAMA //////////////////////////////////////
void main()
{
lcd_init();
lcd_putc("fIniciando...
");
delay_ms(2000);
lcd_putc("f");
while(1)
{
leer_gps(); //leo datos
lcd_gotoxy(1,1); //los muestro
printf(lcd_putc,"L%U*%F*%C",gps.lat_g,gps.lat_m,gps.lat_ns);
//delay_ms(1000); // SI UTILIZO ESTA PAUSA, SE CUELGA
}
}
void leer_gps()
{
int8 n;
char c;
char buffer[10];
char sentencia_gps[6];
strcpy(sentencia_gps,"GPRMC"); //Este es la sentencia que interesa
while(1)
{
if(kbhit())
{
c = getc();
if(c=="$") //Caracter indicativo inicio comando
{
for(n=0;n<=4;n++) buffer[n]=getc(); //leo 5 caracteres sentencia
buffer[n]=" ";
if(!strcmp(buffer,sentencia_gps)) // Si es la correcta
{
c=getc(); //quito la coma
for(n=0;n<=5;n++) gps.hora_utc[n]=getc(); //leo 6 caracteres, hora
gps.hora_utc[n]=" ";
c=getc(); //quito la coma
gps.estado=getc(); //leo estado
c=getc(); //quito la coma
for(n=0;n<=1;n++) buffer[n]=getc(); //leo 2 car., grados latitud
buffer[n]=" ";
gps.lat_g=atoi(buffer);
for(n=0;n<=4;n++) buffer[n]=getc(); //leo 5 car., minutos lat.
buffer[n]=" ";
gps.lat_m=atof(buffer);
c=getc(); //quito la coma
gps.lat_ns=getc(); //leo hemisferio
break; // Salgo bucle while
}
}
}
}
}
El GPS envia repetidamente una serie de sentencias de la forma siguiente:
$GPWPL,3733.60,N,00116.00,W,MAZ*4A
$GPGLL,3745.76,N,00129.27,W*72
$GPRMC,182049,A,3745.76,N,00129.27,W,015.0,125.7,231003,002.6W*79
estas y otras mas, cuando termina vuelta a empezar...
Lo que quiero hacer es leer la puerta serie hasta encontrar la sentencia que me interesa, recoger los datos y operar con ellos, una vez haya terminado los calculos, volver a leer la puerta serie, y asi sucesivamente...
El programa funciona bien... pero tengo algunos problemas:
1- Si cuando inicio el programa, el pin de recepcion de la puerta serie esta conectado la mayoria de las veces el programa no hace nada. Para que arranque bien tengo que iniciar el programa y despues conectar el pin.
2- Si despues de leer los datos pongo algun delay para mostrar la informacion o me entretengo demasiado en hacer otras cosas, cuando vuelvo a leer el GPS el programa se queda colgado.
Si no pongo el delay, el programa lee y muestra los datos continuamente.
No se que hacer, ayuda please....
Gracias
Saludos