NMEA0813フォーマットのGPSから情報を取り出すプログラムです。
Dependents: GPS_test EM_Logger
nmea0813.cpp
- Committer:
- YSB
- Date:
- 2013-03-29
- Revision:
- 0:42a334c405de
- Child:
- 1:f4d3c59a4917
- Child:
- 2:7870c69fa58c
File content as of revision 0:42a334c405de:
#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; }