Holas a todos, ando "simulando" la conexion de un pic 18f4455 con un gps, por ahora, como no tengo el cps estoy mandando las mismas tramas que envia este (tomadas de uno real de la universidad) mendiante el puerto serial de un pc. El problema es que si envio una sola trama, me la recive, y separa los 2 datos que nesecito, latitud y longitud, y los imprime, el problema es que a penas envio una segunda trama, no hace nada, no actualiza los datos. No he podido encontrar el error, a alguno de ustedes le ha pasado esto??
Si alguien tiene el tiempo de revisarlo, aca dejo el codigo.
Muchas gracias a todos, cualquier ayuda sera bien recibida.
esta es la trama que envia el gps.
$GPGGA,195002.000,0614.4766,N,07535.4178,W,1,08,1.0,1534.5,M,1.3,M,,0000*42
luego trato de enviar una similar, con los numeros diferentes, pero mismo numero de caracteres y posiciones.
aca el codigo:
#include "C:\Users\PsychoBear\Documents\UPB\perifericos\lab 3\testeo rs232\lcd solo\lcd_ini\lcd_ini1.h"
#use RS232(BAUD=4800,RCV=PIN_C7,XMIT=PIN_C6,PARITY=N,BITS=8)
void ini_lcd();
void escribo(cadena);
char c,cadena1[100], latitud[11],longitud[12];
int j=0,i=0,contcoma=0,contcoma2=0,contprint=0,entre=0,k=0,l=0;
int1 tengocoord=0,termine=0;
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_32|RTCC_8_bit);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
setup_oscillator(False);
// TODO: USER CODE!!
delay_ms(30);
ini_lcd();
for(;;){
if (kbhit()) //&& contcoma<=11
{
j++;
c=getc();
cadena1[j]=c;//meto la trama en una cadena
if(c==',')
contcoma++; //cuento el numero de comas para saber mas o menos cuando termina la trama
}
if(contcoma>=11){ //aca ya se que termino la trama
for(i=0;i<=100;i++){
if(cadena1[i]==',')
contcoma2++; // busco las 2 primeras comas para encontrar el lugar de la longitud.
contprint=i; //esto lo voy a nitar mas abajo
if(contcoma2==2 && entre==0){//entro aca cuando tengo la posicion de la segunda coma
entre=1;//para no entrar mas de una vez
while(contprint<=i+23){//para recorrer latitud y longitud
contprint++;
if(contprint<=i+11){ //recorro primero la latitud
latitud[contprint-i]=cadena1[contprint]; //guardo la latidut en latidud[x]
}
if(contprint>i+12){//luego recorro la longiud
longitud[contprint-12-i]=cadena1[contprint];//guardo la longitud
tengocoord=1;}//bandera para saber cuando tengo las coordenadas separadas
}
}
}
if(tengocoord==1){//cuando ya tenga las 2 coordenadas
for(k=1;k<=11;k++){
escribo(latitud[k]); //imprimo la latidud en el primer renglon del display
delay_ms(1);
}
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(192);//cursor a segunda linea
output_low(pin_D5);//E
for(l=1;l<=12;l++){
escribo(longitud[l]); //escribo longitud en el segundo renglon
delay_ms(1);
if(l==12){//////////////////////////DE ACA EN ADELANTE ES LO QUE CREO QUE NO FUNCIONA
////////////// PONGO TODAS LAS VARIABLES EN 0, PARA EN TEORIA, SUBIR AL INICIO DEL FOR
///////////// Y ESPERAR UNA NUEVA COORDENADA
j=0;
i=0;
contcoma=0;
contcoma2=0;
contprint=0;
entre=0;
k=0;
tengocoord=0;
termine=0;
}
l=0;
}
termine=1;
}
}
if(termine==1){
j=0;
i=0;
contcoma=0;
contcoma2=0;
contprint=0;
entre=0;
k=0;
l=0;
tengocoord=0;
termine=0;
}
}///////////////////////////////CIERRA FOR INFINITO
}
void escribo(cadena){
output_high(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(cadena);//imprime
output_low(pin_D5);//E
}
void ini_lcd(){
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//limpia lcd
output_low(pin_D5);//E
delay_ms(30);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//function set
output_low(pin_D5);//E
delay_ms(20);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(63);//display on/off control
output_low(pin_D5);//E
delay_ms(20);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(59);//entry mode seet
output_low(pin_D5);//E
delay_ms(20);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(15);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(1);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(20);
output_low(pin_D7);//RS
output_low(pin_D6);//RW
output_high(pin_D5);//E
output_B(6);//pone la DDRAM
output_low(pin_D5);//E
delay_ms(200);
}