NMEA0813フォーマットのGPSから情報を取り出すプログラムです。
Dependents: GPS_test EM_Logger
Revision 0:42a334c405de, committed 2013-03-29
- 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