Autor Tema: Lo prometido es deuda....  (Leído 1809 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado badtzdizzy

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 234
Lo prometido es deuda....
« en: 26 de Octubre de 2006, 19:44:06 »
Aquí están los códigos tanto para el GR48 como para el PIC. Basicamente lo que hacen es que cuando el GPS conectado al PIC está listo para dar posición el PIC activa al modem y este toma los datos del GPS y los manda por SMS a un número celular especificado. Aunque es algo sencillo pues en un principio me costó bastante. El modem se programa con el IDE M2M Power de Sonyericsson.

Para el modem:
Código: [Seleccionar]
/*Envio de SMS*/

main ()
{
int ESTADO_RED=10;
int RED_REGISTRADA=1;

int i=0;
int val=0;
int ban=0;
int aterr;
int smserr;

/*Define destinatario*/

char numero[14]="aquí va numero celular";
char texto[36];
char dato[2]="8";

/*Desactiva la transmisión sobre la red GSM*/

prs(0);

/*Abre UART 3*/

utc(1,3,0);

/*Configura IO3 e IO4 como salidas*/

val=io(2,2,1);
val=io(2,3,1);

/*Pone en bajo IO3 e IO4*/

io(1,2,0);
io(1,3,0);

/*Espera la conexión a la red GSM*/

for(i=0;i<20;i++)
{

/*Lee el estado del byte que indica la conexión GSM*/
val=gtb(ESTADO_RED);

/*Verifica conexión a la red GSM*/
if(val==RED_REGISTRADA)
{
io(1,2,1);
break;
}
dlys(1);
}
for(;;)
{

/*Envia dato para sincronizar*/
uts(dato,slen(dato));

/*Obtiene posición*/
ban=utr(texto,slen(texto));
if(ban!=0)
{
io(1,2,0);
dlys(2);
io(1,2,1);
break;
}
}

/*Si el modulo se conecta intenta el envío del SMS*/
if(val==RED_REGISTRADA)
{
dlys(2);
io(1,2,0);

/*Crea canal para envio de comandos AT*/
aterr=atcrt();

for(;;)
{

/*Si la longitud del SMS es menor o igual a 160 caracteres*/
if(slen(texto)<161)
{
dlys(2);
io(1,2,1);
io(1,3,1);

/*Envia el SMS*/
smserr=smss(numero,texto,129,slen(numero),slen(texto));

/*Checa si el SMS se envio correctamente o no*/
if(smserr==0)
{
io(1,3,1);
break;
}
else
{
io(1,3,0);
}
dlys(3);
}

/*Señala si el SMS no se envió*/
else
{
io(1,2,0);
io(1,3,0);
}
aterr=atdst();
dlys(5);
}

/*Cierra UART 3*/
utc(0,0,0);

/*Reactiva la transmisión de información sobre la red GSM*/
prs(1);
}
}

y para el PIC tenemos:

Código: [Seleccionar]
///////////////////////////////////////////////////////
////
////  Programa SMS - GPS
////  Diseñador: J.M.E.
////  Fecha: 20/10/06
////
///////////////////////////////////////////////////////

#include <18F2320.h>
#use delay(clock=20000000)
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT
#use rs232(baud=4800, xmit=PIN_B0,rcv=PIN_B1,stream=GPS)
#use rs232(baud=9600, xmit=PIN_A0,rcv=PIN_A1,stream=MODEM)
#use rs232(baud=115200, xmit=PIN_C6,rcv=PIN_C7,stream=PC)

int const lenbuff=60;  // Tamaño del buffer de recepción

char gpsbuff[lenbuff]; // Buffer GPS
char latitud[lenbuff];
char longitud[lenbuff];

void inicbuff(void)
{                   // Inicia a \0 cbuff -------------------
int i;
for(i=0;i<lenbuff;i++)
{                   // Bucle que pone a 0 todos los
gpsbuff[i]=0;   // caracteres en el buffer
latitud[i]=0;
longitud[i]=0;
}
}

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
for(i=4;i<7;i++)
{
fputc(gpsbuff[i],PC);
}
fputc('-',PC);
}
delay_ms(8000);
}
while(gpsbuff[5]!='0');
output_high(PIN_B7);
fprintf(PC,"GPS Listo!\r\n");
}

void comando(void)
{
int  i;
int j=0;
int k=0;

// Comando >QPV<

inicbuff();
fprintf(GPS,">QPV<");

while(!kbhit(GPS));
{
for(i=0;i<30;i++)
{
gpsbuff[i]=fgetc(GPS);
}

//// Latitud
for(i=9;i<17;i++)
{
latitud[j]=gpsbuff[i];
j++;
}

//// Longitud
for(i=17;i<26;i++)
{
longitud[k]=gpsbuff[i];
k++;
}
fprintf(MODEM,"Latitud:%8s,Longitud:%9s",latitud,longitud);
}
}

void main()
{
char dato;

delay_ms(1000);
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);  // Inicia MODEM
output_high(PIN_A3);
delay_ms(1500);
output_low(PIN_A3);
inicbuff();                         // Borra buffer al inicio
delay_ms(25);
do
{
if(kbhit(MODEM))
{
output_toggle(PIN_B7);
dato=fgetc(MODEM);
fputc(dato,PC);
if(dato=='8')
{
output_toggle(PIN_B7);
comando();       // Si hay comando pendiente
}          // de procesar ... lo procesa.
}
}
while (TRUE);
}

Si ven algo que corregir u optimizar, adelante se los agradeceré

Saludos

Jaime


 

anything