GM862 Modülünden GPS Koordinatlarını Ayrıştırma Problemi

Başlatan kemalsaruhan, 24 Mayıs 2012, 01:01:03

kemalsaruhan

Merhaba Arkadaşlar,

Telit GM862-GPS modülünden 16F877 ile  CCS C dilini kullanarak GPS koordinatlarını alıp sms olarak atmaya çalışıyorum.
İlk önce Teilt'in programı RSTERM'ü kullanarak modem ile uart usb aracılığıyla bilgisayardan  sms atma ve gps koordinatlarını alma için gerekli  AT komutlarını çıkardım.  Modem düzgün çalışyor. Mikroişlemci ile modülü çalıştırırken de RSTERM ile mikroişlemcinin yolladığı veriyi ve modemin cevabını gözlemliyorum.
16F877 SMS'i düzgün bir şekilde atıyor. GPS'den konum alırken MODEM sorunsuz veriyi yolluyor.
Fakat GPS koordinatlarını alırken modemin yolladığı string veriyi bir değişkene alarak ayrıştırma işlemini yapamıyoruz.
Aşağıda 16F877 ile modem haberleşirken RSTERM den izlediğimiz ekran var. Normalde ">" ifadesinden sonra koorinatları yazması gerekiyor.

upload pictures


CCS C 16F877 Kodlarımız.
Alıntı Yap
#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#define use_portb_lcd TRUE   // LCD B portuna bağlı
#include <lcd.c>   // lcd.c dosyası tanıtılıyor
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7,parity=N, stop=1, ERRORS)

int k,i=0,basla=0;
char input[80];


#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{

    static unsigned char c;
   
    c=getchar();
   
    if(c==30){basla=1; printf(lcd_putc,"%c",c);}
   
    if(basla==1)
    {   
      input=c;
      i++; 
    }
   
    if(i=48) { i=0;basla=0;}
}

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı
   
   
    enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
    set_tris_a(0x01);   // TX,RX uçlarının hangi pinler olacağını tanımlıyor
    delay_ms(3000);     // parity bitinin olmadığını, stop bitinin 1 bit olacağı belirtiliyor
    output_high(pin_c5);// RC5 çıkışı ilk anda sıfırlanıyor
    output_low(pin_A0); // RC5 çıkışı ilk anda sıfırlanıyor
    lcd_init();         // LCD'yi hazırla


    delay_ms(4500);
    printf("AT");delay_ms(100);
    putc(13);delay_ms(2000);

    printf("AT+IPR=9600");delay_ms(100);
    putc(13);delay_ms(2000);

   
    printf("AT+CMEE = 2");delay_ms(100);
    putc(13);delay_ms(2000);

    printf("AT+CPIN=2052");delay_ms(100);//PIN KODU
    putc(13);delay_ms(3000);
   
   
    printf("AT$GPSNMUN=0,0,0,0,0,0,0");delay_ms(100);
    putc(13); delay_ms(20000);
   
    enable_interrupts(int_rda);//int_rda KESME AKTİF
   
    printf("AT$GPSACP");
    putc(13);
    delay_ms(20000);     

    disable_interrupts(int_rda); // int_rda kesmesini pasif yap

     
    printf("AT+CSCA=+905429800033");delay_ms(100);//MESAJ MERKEZİ
    putc(13); delay_ms(5000);
 
    printf("AT+CMGF=1");delay_ms(100);
    putc(13);delay_ms(10000); 
   
    printf("AT+CMGS=+905074706822");delay_ms(100);
    putc(13); delay_ms(3000);
   
    printf("%c %c %c",input[10],input[11],input[12]);
    delay_ms(3000);     
    putc(13); delay_ms(1000);
    putc(26);
   
}

Klein

struct{
  char *header;
  char *format;
  char end_char;
  char seperator;  
}protocol_formats[2];

struct{
  float time;
  char status;
  float pos_ltd;
  char vert_ind;
  float pos_lgt;
  char hrz_ind;
  float speed;
  float direction;
  long date;
  float variation;
  char variation_direction;
  float altitude;
  char altitude_unit;
  float update_time;
} gps_raw_data;

void init_protocol_formats(void){
  protocol_formats[0].header="$GPRMC,\0";
  protocol_formats[0].format="%f,%c,%f,%c,%f,%c,%f,%f,%lu,%f,%c";
  protocol_formats[0].end_char='\r';
  protocol_formats[0].seperator=',';
  protocol_formats[1].header="$GPGGA,\0";
  protocol_formats[1].format=",,,,,,,,%f,%c,,,%f";
  protocol_formats[1].end_char='\r';
  protocol_formats[1].seperator=',';
}

void gps_decode(index){        
          sscanf(gps_comm_buf,protocol_formats[index].format,
                  &gps_raw_data.time,
                  &gps_raw_data.status,
                  &gps_raw_data.pos_ltd,
                  &gps_raw_data.vert_ind,
                  &gps_raw_data.pos_lgt,
                  &gps_raw_data.hrz_ind,
                  &gps_raw_data.speed,
                  &gps_raw_data.direction,
                  &gps_raw_data.date,                  
                  &gps_raw_data.variation,
                  &gps_raw_data.variation_direction                  
                    );
}

kemalsaruhan

Merhaba hocam.
Bu kodlar CCS C'demi yazılmış. Derliyorum sscanf'de hata veriyor. Onun kütüphanesini  http://www.ccsinfo.com/forum/viewtopic.php?t=20225 ekledim. Yine de hata veriyor. Biraz daha bilgi verebilir misiniz?