test ver (get more data from GPS)
Dependents: sample_GPS_GYSFDMAXB_edite_by_asha GPSDRV8833CanSat
getGPS.cpp@4:e1e7bfab1993, 2021-10-12 (annotated)
- Committer:
- asha_ndf
- Date:
- Tue Oct 12 14:58:12 2021 +0000
- Revision:
- 4:e1e7bfab1993
- Parent:
- 3:0ad6cc87d7cd
fix int double;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CanSat_C | 0:030ffb18f36d | 1 | #include "mbed.h" |
CanSat_C | 0:030ffb18f36d | 2 | #include "getGPS.h" |
CanSat_C | 0:030ffb18f36d | 3 | |
CanSat_C | 0:030ffb18f36d | 4 | GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx) |
CanSat_C | 0:030ffb18f36d | 5 | { |
asha_ndf | 2:4a3a10bc7309 | 6 | gpstime =0; //GPSから取得した時刻。 |
asha_ndf | 2:4a3a10bc7309 | 7 | longitude =0; |
asha_ndf | 2:4a3a10bc7309 | 8 | latitude =0; |
asha_ndf | 2:4a3a10bc7309 | 9 | hdop =0; //位置情報精度 |
asha_ndf | 2:4a3a10bc7309 | 10 | hight =0; //海抜高度 |
asha_ndf | 2:4a3a10bc7309 | 11 | //GPVTG |
asha_ndf | 2:4a3a10bc7309 | 12 | direction =0; //進行方向(真北基準) |
asha_ndf | 2:4a3a10bc7309 | 13 | speed =0; //対地速度kmph |
CanSat_C | 0:030ffb18f36d | 14 | _gps.baud(GPSBAUD); |
CanSat_C | 0:030ffb18f36d | 15 | _gps.printf("$PMTK314,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29"); |
CanSat_C | 0:030ffb18f36d | 16 | } |
CanSat_C | 0:030ffb18f36d | 17 | |
CanSat_C | 0:030ffb18f36d | 18 | bool GPS::getgps() |
CanSat_C | 0:030ffb18f36d | 19 | { |
CanSat_C | 0:030ffb18f36d | 20 | char gps_data[256]; |
asha_ndf | 2:4a3a10bc7309 | 21 | char gpgga_data[256]; |
asha_ndf | 2:4a3a10bc7309 | 22 | char gpvtg_data[256]; |
CanSat_C | 0:030ffb18f36d | 23 | |
asha_ndf | 2:4a3a10bc7309 | 24 | int i; |
asha_ndf | 2:4a3a10bc7309 | 25 | int flag1 = 0; //GPGGA |
asha_ndf | 2:4a3a10bc7309 | 26 | int flag2 = 0; //GPVTG |
asha_ndf | 2:4a3a10bc7309 | 27 | for (int p=0; p<50; p++){ |
CanSat_C | 0:030ffb18f36d | 28 | while(_gps.getc() != '$'); //$マークまで読み飛ばし |
CanSat_C | 0:030ffb18f36d | 29 | i = 0; |
CanSat_C | 0:030ffb18f36d | 30 | |
CanSat_C | 0:030ffb18f36d | 31 | /* gpa_data初期化 */ |
CanSat_C | 0:030ffb18f36d | 32 | for(int j = 0; j < 256; j++) |
CanSat_C | 0:030ffb18f36d | 33 | gps_data[j] = '\0'; |
CanSat_C | 0:030ffb18f36d | 34 | |
CanSat_C | 0:030ffb18f36d | 35 | /* NMEAから一行読み込み */ |
CanSat_C | 0:030ffb18f36d | 36 | while((gps_data[i] = _gps.getc()) != '\r') { |
CanSat_C | 0:030ffb18f36d | 37 | i++; |
CanSat_C | 0:030ffb18f36d | 38 | if(i == 256) { |
CanSat_C | 0:030ffb18f36d | 39 | i = 255; |
CanSat_C | 0:030ffb18f36d | 40 | break; |
CanSat_C | 0:030ffb18f36d | 41 | } |
CanSat_C | 0:030ffb18f36d | 42 | } |
asha_ndf | 2:4a3a10bc7309 | 43 | if (strstr(gps_data, "GPGGA") != NULL){ |
asha_ndf | 2:4a3a10bc7309 | 44 | strcpy(gpgga_data,gps_data); |
asha_ndf | 2:4a3a10bc7309 | 45 | flag1=1; |
asha_ndf | 2:4a3a10bc7309 | 46 | } |
asha_ndf | 2:4a3a10bc7309 | 47 | if(strstr(gps_data, "GPVTG") != NULL){ |
asha_ndf | 2:4a3a10bc7309 | 48 | strcpy(gpvtg_data,gps_data); |
asha_ndf | 2:4a3a10bc7309 | 49 | flag2=1; |
asha_ndf | 2:4a3a10bc7309 | 50 | } |
asha_ndf | 2:4a3a10bc7309 | 51 | if (flag1 * flag2== 0){ |
asha_ndf | 2:4a3a10bc7309 | 52 | break; |
asha_ndf | 2:4a3a10bc7309 | 53 | } |
asha_ndf | 2:4a3a10bc7309 | 54 | } //GPGGAとGPVTGが取得できるまで1行ずつ読む |
asha_ndf | 2:4a3a10bc7309 | 55 | //For GPGGA================================================================ |
CanSat_C | 0:030ffb18f36d | 56 | int rlock; |
CanSat_C | 0:030ffb18f36d | 57 | char ns,ew; |
CanSat_C | 0:030ffb18f36d | 58 | double w_time, raw_longitude, raw_latitude; |
CanSat_C | 0:030ffb18f36d | 59 | int satnum; |
CanSat_C | 0:030ffb18f36d | 60 | |
asha_ndf | 2:4a3a10bc7309 | 61 | if(sscanf(gpgga_data, "GPGGA,%lf,%lf,%c,%lf,%c,%d,%d,%lf,%lf", &w_time, &raw_latitude, &ns, &raw_longitude, &ew, &rlock, &satnum, &hdop, &hight) > 1) { |
asha_ndf | 2:4a3a10bc7309 | 62 | /* 座標を求める (度と分で分割して度にする。intは切り捨て)*/ |
asha_ndf | 3:0ad6cc87d7cd | 63 | gpstime = w_time; |
CanSat_C | 0:030ffb18f36d | 64 | int latitude_dd = (int)(raw_latitude / 100); |
CanSat_C | 0:030ffb18f36d | 65 | int longitude_dd = (int)(raw_longitude / 100); |
asha_ndf | 4:e1e7bfab1993 | 66 | double latitude_md = (raw_latitude - latitude_dd * 100) / 60; |
asha_ndf | 4:e1e7bfab1993 | 67 | double longitude_md = (raw_longitude - longitude_dd * 100) / 60; |
CanSat_C | 0:030ffb18f36d | 68 | latitude = latitude_dd + latitude_md; |
CanSat_C | 0:030ffb18f36d | 69 | longitude = longitude_dd + longitude_md; |
asha_ndf | 2:4a3a10bc7309 | 70 | flag1 = 1; |
asha_ndf | 2:4a3a10bc7309 | 71 | }else{ |
asha_ndf | 2:4a3a10bc7309 | 72 | flag1 = 0; //GGAセンテンスの情報が欠けている時 |
asha_ndf | 2:4a3a10bc7309 | 73 | } |
asha_ndf | 2:4a3a10bc7309 | 74 | |
asha_ndf | 2:4a3a10bc7309 | 75 | //For GPVTG================================================================ |
asha_ndf | 2:4a3a10bc7309 | 76 | char c1, c2,c3; |
asha_ndf | 2:4a3a10bc7309 | 77 | double f1, f2, f3, f4; |
asha_ndf | 2:4a3a10bc7309 | 78 | if(sscanf(gpvtg_data, "GPVTG, %lf, %c, %lf, %c, %lf, %c, %lf", &f1, &c1, &f2, &c2, &f3, &c3, &f4)>1){ |
asha_ndf | 2:4a3a10bc7309 | 79 | direction = f1; |
asha_ndf | 2:4a3a10bc7309 | 80 | speed = f4; |
asha_ndf | 2:4a3a10bc7309 | 81 | flag2 = 1; |
asha_ndf | 2:4a3a10bc7309 | 82 | }else{ |
asha_ndf | 2:4a3a10bc7309 | 83 | flag2 = 0; |
asha_ndf | 2:4a3a10bc7309 | 84 | } |
asha_ndf | 2:4a3a10bc7309 | 85 | //return |
asha_ndf | 2:4a3a10bc7309 | 86 | if (flag1*flag2 ==1){ |
CanSat_C | 0:030ffb18f36d | 87 | return true; |
asha_ndf | 2:4a3a10bc7309 | 88 | }else{ |
asha_ndf | 2:4a3a10bc7309 | 89 | return false; |
asha_ndf | 2:4a3a10bc7309 | 90 | } |
asha_ndf | 2:4a3a10bc7309 | 91 | |
asha_ndf | 2:4a3a10bc7309 | 92 | |
CanSat_C | 0:030ffb18f36d | 93 | } |