Hola a todos, quiero compartir con ustedes algo que hice modificando el código de RedPic (espero no se moleste). Con esto he logrado obtener ciertos datos de un gps trimble usando el protocolo TAIP. Ya está probado y funciona muy bien.
///////////////////////////////////////////////////////
////
//// Programa control PIC - GPS por RS232
//// Fecha: 08/09/06
////
///////////////////////////////////////////////////////
#include <18f4320.h>
#use delay(clock=8000000)
#fuses INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use rs232(baud=4800, xmit=PIN_B0,rcv=PIN_B1,stream=GPS)
#use rs232(baud=38400, xmit=PIN_C6,rcv=PIN_C7,stream=PC)
int const lenbuff=40; // Tamaño del buffer de recepción
int xbuff=0; // Índice: siguiente char en cbuff
char cbuff[lenbuff]; // Buffer
char gpsbuff[lenbuff]; // Buffer GPS
char rcvchar=0; // Ultimo caracter recibido
int1 flagcommand=0; // Flag para indicar comando disponible
void presmenu(void); // Presenta el menú
void inicbuff(void); // Borra buffer
int addcbuff(char c); // añade caracter recibido al buffer
void echos(char c); // Eco selectivo sobre RS232
void comando(void); // Procesa comando
#int_rda
void serial_isr()
{ // Interrupción recepción serie USART
rcvchar=0; // Inicializo caracter recibido
if(kbhit(PC))
{ // Si hay algo pendiente de recibir ...
rcvchar=fgetc(PC); // lo descargo y ...
addcbuff(rcvchar); // lo añado al buffer y ...
echos(rcvchar); // hago eco (si procede).
}
}
void presmenu(void)
{ // Presenta el menú --------------------
delay_ms(25);
fprintf(PC,"\r\n");
fprintf(PC,"** PIC-GPS POR RS232 **\r\n\n"); // Presenta menú
fprintf(PC,"** Control del buffer:\r\n");
fprintf(PC,"[Enter] Procesa comando\r\n");
fprintf(PC,"[Escape] Borra todo el buffer\r\n");
fprintf(PC,"[Delete] Borra ultimo caracter del buffer\r\n");
fprintf(PC,"\n");
fprintf(PC,"** Comandos GPS:\r\n");
fprintf(PC,"/? Presenta Menu\r\n");
fprintf(PC,">QPV< Posicion y Velocidad\r\n");
fprintf(PC,">QTM< Hora, Fecha y No. de Satelites\r\n");
fprintf(PC,">QVR< Numero de Version\r\n");
fprintf(PC,">QST< Estado\r\n");
fprintf(PC,"\n");
delay_ms(25);
}
int addcbuff(char c)
{ // Añade a cbuff -----------------------
switch(c)
{
case 13: // Enter -> Habilita Flag para procesar
flagcommand=1; // Comando en Main
break;
case 8: // Del -> Borra último caracter del Buffer
if(xbuff>0)
cbuff[--xbuff]=0;
break;
case 27: // Esc -> Borra el Buffer completamente
inicbuff();
break;
default:
cbuff[xbuff++]=c; // Añade caracter recibido al Buffer
if(xbuff>lenbuff)
xbuff=lenbuff;
}
}
void echos(char c)
{ // Echo selectivo ----------------------
int i;
switch(c)
{
case 13:
fprintf(PC,"\r\n"); // Si he pulsado la tecla [Intro]
break;
case 8:
fprintf(PC,"\r%s \b",cbuff); // Si he pulsado la tecla [Retroceso]
break;
case 27:
fprintf(PC,"\r"); // Si he pulsado la tecla [Escape]
for(i=0;i<lenbuff;i++)
{
fprintf(PC," "); // Borra display (en la longitud del buffer)
}
fprintf(PC,"\r");
break;
default:
fputc(rcvchar,PC); // Echo de cualquier otro caracter
}
}
void inicbuff(void)
{ // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++)
{ // Bucle que pone a 0 todos los
cbuff[i]=0; // caracteres en el buffer
gpsbuff[i]=0;
}
xbuff=0; // Inicializo el indice de siguiente caracter
}
void inicia_gps(void)
{
int i,j;
inicbuff();
do
{
fprintf(GPS,">QST<");
while(!kbhit(GPS));
{
for(i=0;i<8;i++)
{
gpsbuff[i]=fgetc(GPS);
}
// Estado GPS
fprintf(PC,"Estado GPS:");
for(i=4;i<7;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
delay_ms(8000);
}
while(gpsbuff[5]!='0');
output_high(PIN_A1);
fprintf(PC,"GPS Listo!\r\n");
}
void main()
{
setup_oscillator(OSC_8MHZ | OSC_INTRC);
delay_ms(100);
fprintf(PC,"Iniciando GPS...\r\n");
delay_ms(15000); // Retardo para inicio interno del GPS
// Configuracion inicial GPS
fprintf(GPS,">SRM;FR_FLAG=F;ID_FLAG=F;CS_FLAG=F;EC_FLAG=F;CR_FLAG=F<");
delay_ms(1000);
inicia_gps(); // Funcion que inicia el GPS hasta que esta listo para usarse
delay_ms(1000);
inicbuff(); // Borra buffer al inicio
presmenu(); // Presenta el menú
enable_interrupts(int_rda); // Habilita Interrupción RDA
enable_interrupts(global); // Habilita interrupciones
delay_ms(25);
do
{
if(flagcommand)
comando(); // Si hay comando pendiente
// de procesar ... lo procesa.
}
while (TRUE);
}
void comando(void)
{
int i,j,u,h;
int1 flagvalido=0; // Flag para detectar comandos invalidos
char arg[lenbuff]; // Argumento de comando (si lo tiene)
disable_interrupts(int_rda); // Dehabilito Interrupción RDA durante procesado
flagcommand=0; // Desactivo flag de comando pendiente.
for(i=0;i<lenbuff;i++)
{ // Limpia el argumento (por si lo hay)
arg[i]=0;
}
// Comando /?
if(cbuff[0]=='/'&&cbuff[1]=='?')
{ // Comparo inicio del buffer con comando "/?"
flagvalido=1; // Marco comando válido
presmenu(); // Presenta el menú
}
// Comando >QPV<
if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='P'&&cbuff[3]=='V'&&cbuff[4]=='<')
{ // Comparo inicio del buffer con comando ">QPV<"
flagvalido=1; // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QPV<");
while(!kbhit(GPS));
{
for(i=0;i<30;i++)
{
gpsbuff[i]=fgetc(GPS);
}
//// Latitud
fprintf(PC,"Latitud:");
for(i=9;i<17;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
//// Longitud
fprintf(PC,"Longitud:");
for(i=17;i<26;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
//// Velocidad
fprintf(PC,"Velocidad:");
for(i=26;i<29;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}
// Comando >QTM<
if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='T'&&cbuff[3]=='M'&&cbuff[4]=='<')
{ // Comparo inicio del buffer con comando ">QTM<"
flagvalido=1; // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QTM<");
while(!kbhit(GPS));
{
for(i=0;i<28;i++)
{
gpsbuff[i]=fgetc(GPS);
}
// Hora
fprintf(PC,"Hora:");
for(i=4;i<6;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(':',PC);
for(i=6;i<8;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
// Fecha
fprintf(PC,"Fecha:");
for(i=13;i<15;i++)
{
fputc(gpsbuff[i],PC);
}
fputc('/',PC);
for(i=15;i<17;i++)
{
fputc(gpsbuff[i],PC);
}
fputc('/',PC);
for(i=17;i<21;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
// No. de Satelites
fprintf(PC,"Satelites:");
for(i=24;i<26;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}
// Comando >QVR<
if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='V'&&cbuff[3]=='R'&&cbuff[4]=='<')
{ // Comparo inicio del buffer con comando ">QVR<"
flagvalido=1; // Marco comando válido
inicbuff();
output_toggle(PIN_A1);
fprintf(GPS,">QVR<");
while(!kbhit(GPS));
{
for(i=0;i<35;i++)
{
gpsbuff[i]=fgetc(GPS);
}
// Version GPS
fprintf(PC,"Version GPS\r\n");
for(i=16;i<40;i++)
{
fputc(gpsbuff[i],PC);
}
fputc(13,PC);
fputc(10,PC);
}
}
// Comando >QST<
if(cbuff[0]=='>'&&cbuff[1]=='Q'&&cbuff[2]=='S'&&cbuff[3]=='T'&&cbuff[4]=='<')
{ // Comparo inicio del buffer con comando ">QST<"
flagvalido=1; // Marco comando válido
inicia_gps();
}
// Retorno error o comando invalido
if(!flagvalido)
fprintf(PC,"¿%s?\r\n",cbuff);
inicbuff(); // Borro buffer.
enable_interrupts(int_rda); // Habilita de nuevo Interrupción RDA
}
Espero les sirva, cabe señalar que para que funcione su gps debe estar configurado con entrada/salida TAIP.
Saludos a todos desde México