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

Dependents:   GPS_test EM_Logger

Files at this revision

API Documentation at this revision

Comitter:
YSB
Date:
Fri Mar 29 05:55:53 2013 +0000
Child:
1:f4d3c59a4917
Child:
2:7870c69fa58c
Commit message:
ver.1.0

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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nmea0813.cpp	Fri Mar 29 05:55:53 2013 +0000
@@ -0,0 +1,148 @@
+#include "nmea0813.h"
+ 
+GPS::GPS(PinName tx,PinName rx) : Serial(tx,rx){
+    //time_str[8] = {'0','0',':','0','0',':','0','0'};
+    //latitude_str[9] = {'0','0','0','0','.','0','0','0','0'};
+    //longitude_str[10]= {'0','0','0','0','0','.','0','0','0','0'};
+    flg = 0;
+    count = 0;
+    attach(this, &GPS::rxHandler,Serial::RxIrq);
+    T.attach(this,&GPS::update_infomation,1.0);
+}
+ 
+ 
+void GPS::rxHandler(void){
+    char rxbuf;
+    rxbuf = getc();
+    GPSdata[count] = rxbuf;
+    if(rxbuf == '$'){       
+        count++;
+    }
+    else if(rxbuf == LF){
+        count++;
+        flg++;
+    }
+    else{
+        count++;
+    }
+    if(flg == 7){
+        flg = 0;
+        count=0;
+    }
+}
+
+void GPS::update_infomation() { //repeatedlly called function
+    get_GGA_RMC(GPSdata);
+    get_infomation(GPGGA,GPRMC);
+}
+
+void GPS::get_GGA_RMC(char* str){
+    int nullflg=0;
+    char *sp;
+
+    sp = (char*) strstr(str,"$GPGGA");
+    for(int i=0;i<80;i++){
+        if(nullflg ==0){
+            if(sp[i] != '\n'){
+                GPGGA[i] = sp[i];
+            }else{
+                GPGGA[i] = '\n';
+                nullflg = 1;
+            }
+        }else{
+            GPGGA[i] = '\n';
+        }           
+    }
+    nullflg = 0;
+    sp = (char*) strstr(str,"$GPRMC");
+    for(int i=0;i<80;i++){
+        if(nullflg ==0){
+            if(sp[i] != '\n'){
+                GPRMC[i] = sp[i];
+            }else{
+                GPRMC[i] = '\n';
+                nullflg = 1;
+            }
+        }else{
+            GPRMC[i] = '\n';
+        }           
+    }
+    nullflg = 0;
+}
+
+void GPS::get_infomation(char* gga,char* rmc){
+    if(gga[8]=='0'){
+        time_str[0]=gga[7];
+        time_str[1]=gga[8]+0x09;
+    }else{
+        time_str[0]=gga[7]+0x01;
+        time_str[1]=gga[8]-0x01;
+    }
+    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];
+    
+    states = rmc[18];
+    
+    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];
+    }
+    speed = (float)(speed_str[0]-0x30)*100.0+\
+            (float)(speed_str[1]-0x30)*10.0+\
+            (float)(speed_str[2]-0x30)*1.0+\
+            (float)(speed_str[4]-0x30)*0.1;
+    latitude = (float)(latitude_str[0]-0x30)*10.0+  \
+               (float)(latitude_str[1]-0x30)+       \
+               ((float)(latitude_str[2]-0x30)*10.0+ \
+               (float)(latitude_str[3]-0x30)+       \
+               (float)(latitude_str[5]-0x30)*0.1+   \
+               (float)(latitude_str[6]-0x30)*0.01+  \
+               (float)(latitude_str[7]-0x30)*0.001+ \
+               (float)(latitude_str[8]-0x30)*0.0001)/60.0;
+    longitude = (float)(longitude_str[0]-0x30)*100.0+ \
+               (float)(longitude_str[1]-0x30)*10.0+  \
+               (float)(longitude_str[2]-0x30)+       \
+               ((float)(longitude_str[3]-0x30)*10.0+ \
+               (float)(longitude_str[4]-0x30)+       \
+               (float)(longitude_str[6]-0x30)*0.1+   \
+               (float)(longitude_str[7]-0x30)*0.01+  \
+               (float)(longitude_str[8]-0x30)*0.001+ \
+               (float)(longitude_str[9]-0x30)*0.0001)/60.0;
+}
+
+char* GPS::get_time(){
+    return time_str;
+}
+
+float GPS::get_latitude(){
+    return latitude;
+}
+
+char* GPS::get_str_latitude(){
+    return latitude_str;
+}
+
+float GPS::get_longitude(){
+    return longitude;
+}
+
+char* GPS::get_str_longitude(){
+    return longitude_str;
+}
+
+char GPS::get_states(){
+    return states;
+}
+
+float GPS::get_speed(){
+    return speed;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nmea0813.h	Fri Mar 29 05:55:53 2013 +0000
@@ -0,0 +1,46 @@
+#ifndef _INC_NMEA0813
+#define _INC_NMEA0813
+ 
+#define CR 0x0D
+#define LF 0x0A
+ 
+#include "mbed.h"
+ 
+class GPS : public Serial {
+public:
+    GPS(PinName tx,PinName rx);
+    char* get_time();
+    float get_latitude();
+    char* get_str_latitude();
+    float get_longitude();
+    char* get_str_longitude();
+    char get_states();
+    float get_speed();
+    
+private:
+
+    char GPSdata[1000];  //gps_data_buffer
+    char GPGGA[100];//GPGGA_data
+    char GPRMC[100];//GPRMC_data
+    char time_str[8];
+    char latitude_str[9];
+    float latitude;
+    char longitude_str[10];
+    float longitude;
+    char states;
+    char number_of_satelite;
+    char speed_str[5];
+    float speed;
+
+    int flg,count;//for rx_func()
+    
+    void rxHandler(void);
+    void update_infomation();
+    void get_GGA_RMC(char* str);
+    void get_infomation(char* gga,char* rmc);
+    
+    Ticker T;
+};
+    
+#endif
+ 
\ No newline at end of file