NMEA0813フォーマットのGPSから情報を取り出すプログラムです。

Dependents:   GPS_test EM_Logger

Files at this revision

API Documentation at this revision

Comitter:
YSB
Date:
Fri Aug 16 08:22:08 2013 +0000
Parent:
2:7870c69fa58c
Commit message:
20130816ver

Changed in this revision

nmea0813.cpp Show annotated file Show diff for this revision Revisions of this file
nmea0813.h Show annotated file Show diff for this revision Revisions of this file
--- a/nmea0813.cpp	Fri Jul 05 04:17:36 2013 +0000
+++ b/nmea0813.cpp	Fri Aug 16 08:22:08 2013 +0000
@@ -9,95 +9,70 @@
  
  
 void GPS::rxHandler(void){
-    char rxbuf;
     rxbuf = getc();
     GPSdata[count] = rxbuf;
-    if(rxbuf == '$'){       
-        count++;
-    }
-    else if(rxbuf == LF){
-        count++;
+    if(rxbuf == LF){
         flg++;
-    }
-    else{
-        count++;
-    }
+    }else{}
+    count++;
     if(flg == 7){
         flg = 0;
+        GPSdata[count+1]='\0';
         count=0;
     }
 }
 
 void GPS::update_infomation() { //repeatedlly called function
-    get_GGA_RMC(GPSdata);
-    get_infomation(GPGGA,GPRMC);
+    set_GGA_RMC(GPSdata);
 }
 
-void GPS::get_GGA_RMC(char* str){
-    int nullflg=0;
+void GPS::set_GGA_RMC(char* str){
     char *sp;
-
     sp = (char*) strstr(str,"$GPGGA");
-    for(int i=0;i<80;i++){
-        if(nullflg ==0){
-            if(sp[i] != '\n'){
+    if(sp != NULL){
+        for(int i=0;i<100;i++){
+            if(sp[i] != '*'){
                 GPGGA[i] = sp[i];
             }else{
-                GPGGA[i] = '\n';
-                nullflg = 1;
-            }
-        }else{
-            GPGGA[i] = '\n';
-        }           
+                GPGGA[i] = '*';
+                GPGGA[i+1] = '\0';
+                //gga_checksum = sp[i+1]*16+sp[i+2];
+                i = 100;
+            }          
+        }
     }
-    nullflg = 0;
     sp = (char*) strstr(str,"$GPRMC");
-    for(int i=0;i<80;i++){
-        if(nullflg ==0){
-            if(sp[i] != '\n'){
+    if(sp != NULL){
+        for(int i=0;i<100;i++){
+            if(sp[i] != '*'){
                 GPRMC[i] = sp[i];
             }else{
-                GPRMC[i] = '\n';
-                nullflg = 1;
-            }
-        }else{
-            GPRMC[i] = '\n';
-        }           
-    }
-    nullflg = 0;
-}
-
-void GPS::get_infomation(char* gga,char* rmc){
-    time_str[0]=gga[7];
-    time_str[1]=gga[8];
-    time_str[2]=':';
-    time_str[3]=gga[9];
-    time_str[4]=gga[10];
-    time_str[5]=':';
-    time_str[6]=gga[11];
-    time_str[7]=gga[12];
-    //time_str[8]='\n';
-    
-    status = rmc[18];
-    
-    number_of_satelite = gga[46];
-    
-    for(int i=0;i<9;i++){
-        latitude_str[i]=gga[18+i];
-    }
-    for(int i=0;i<10;i++){
-        longitude_str[i]=gga[30+i];
-    }
-    for(int i=0;i<5;i++){
-        speed_str[i]=rmc[51+i];
-    }
+                GPRMC[i] = '*';
+                GPRMC[i+1] = '\0';
+                //rmc_checksum = sp[i+1]*16+sp[i+2];
+                i = 100;
+            }          
+        }  
+    } 
 }
 
 char* GPS::get_time(){
+    time_str[0]=GPGGA[7];
+    time_str[1]=GPGGA[8];
+    time_str[2]=':';
+    time_str[3]=GPGGA[9];
+    time_str[4]=GPGGA[10];
+    time_str[5]=':';
+    time_str[6]=GPGGA[11];
+    time_str[7]=GPGGA[12];
+    time_str[8]='\0';
+    
     return time_str;
 }
 
 float GPS::get_latitude(){
+    for(int i=0;i<9;i++){latitude_str[i]=GPGGA[18+i];}
+    latitude_str[9]='\0';
     latitude = (float)(latitude_str[0]-0x30)*10.0+  \
                (float)(latitude_str[1]-0x30)+       \
                ((float)(latitude_str[2]-0x30)*10.0+ \
@@ -110,10 +85,14 @@
 }
 
 char* GPS::get_str_latitude(){
+    for(int i=0;i<9;i++){latitude_str[i]=GPGGA[18+i];}
+    latitude_str[9]='\0';
     return latitude_str;
 }
 
 float GPS::get_longitude(){
+    for(int i=0;i<10;i++){longitude_str[i]=GPGGA[30+i];}
+    longitude_str[10]='\0';
     longitude = (float)(longitude_str[0]-0x30)*100.0+ \
                (float)(longitude_str[1]-0x30)*10.0+  \
                (float)(longitude_str[2]-0x30)+       \
@@ -127,14 +106,19 @@
 }
 
 char* GPS::get_str_longitude(){
+    for(int i=0;i<10;i++){longitude_str[i]=GPGGA[30+i];}
+    longitude_str[10]='\0';
     return longitude_str;
 }
 
 char GPS::get_status(){
+    status = GPRMC[18];
     return status;
 }
 
 float GPS::get_speed(){
+    for(int i=0;i<5;i++){speed_str[i]=GPRMC[51+i];}
+    speed_str[5]='\0';
     speed = (float)(speed_str[0]-0x30)*100.0+\
             (float)(speed_str[1]-0x30)*10.0+\
             (float)(speed_str[2]-0x30)*1.0+\
@@ -142,6 +126,7 @@
     return speed;
 }
 
-char GPS::get_satelite_number(){
+int GPS::get_satelite_number(){
+    number_of_satelite = (int)(GPGGA[45]-0x30)*10 + (int)(GPGGA[46]-0x30);
     return number_of_satelite;
 }
\ No newline at end of file
--- a/nmea0813.h	Fri Jul 05 04:17:36 2013 +0000
+++ b/nmea0813.h	Fri Aug 16 08:22:08 2013 +0000
@@ -16,28 +16,28 @@
     char* get_str_longitude();
     char get_status();
     float get_speed();
-    char get_satelite_number();
+    int get_satelite_number();
     
 private:
-    char GPSdata[1000];  //gps_data_buffer
+    char GPSdata[500];//gps_data_buffer
     char GPGGA[100];//GPGGA_data
     char GPRMC[100];//GPRMC_data
     char time_str[9];
-    char latitude_str[9];
+    char latitude_str[10];
     float latitude;
-    char longitude_str[10];
+    char longitude_str[11];
     float longitude;
     char status;
-    char number_of_satelite;
-    char speed_str[5];
+    int number_of_satelite;
+    char speed_str[6];
     float speed;
 
     int flg,count;//for rx_func()
+    char rxbuf,gga_checksum,rmc_checksum;
     
     void rxHandler(void);
     void update_infomation();
-    void get_GGA_RMC(char* str);
-    void get_infomation(char* gga,char* rmc);
+    void set_GGA_RMC(char* str);
     
     Ticker T;
 };