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

Dependents:   GPS_test EM_Logger

Revision:
4:7be9581d0734
Parent:
2:7870c69fa58c
--- 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