Tomáš Götthans, UREL, FEEC, VUT Brno
xgotth00stud.feec.vutbr.cz
Typické hodnoty inicializace | Čas [s] |
Horký start | 1 |
Teplý start | 38 |
Studený start | 42 |
Příklad:
# | formát | příklad | komentář |
---|---|---|---|
1 | c |
A | Přepínání mezi N-rozměrnými módy (A=automatické, M=manuální) |
2 | d |
3 | Počet dimenzí N (1=?, 2=2D, 3=3D) |
3 | dd |
29 | ID prvního satelitu použitelného pro výpočet |
4 | dd |
26 | ID druhého satelitu použitelného pro výpočet |
5 | dd |
22 | ID třetího satelitu použitelného pro výpočet |
6 | dd |
09 | ID čtvrtého satelitu použitelného pro výpočet |
7 | dd |
07 | ID pátého satelitu použitelného pro výpočet |
8 | dd |
05 | ID šestého satelitu použitelného pro výpočet |
9 | dd |
04 | ID sedmého satelitu použitelného pro výpočet |
10 | dd |
N.A. | ID osmého satelitu použitelného pro výpočet |
11 | dd |
N.A. | ID devátého satelitu použitelného pro výpočet |
12 | dd |
N.A. | ID desátého satelitu použitelného pro výpočet |
13 | dd |
N.A. | ID jedenáctého satelitu použitelného pro výpočet |
14 | dd |
N.A. | ID dvanáctého satelitu použitelného pro výpočet |
15 | d.d |
1.7 | PDOP (Position Dilution Of Precision) v metrech |
16 | d.d |
1.0 | HDOP (Horizontal Dilution Of Precision) v metrech |
17 | d.d |
1.4 | VDOP (Vertical Dilution Of Precision) v metrech |
18 | *xx |
30 | Kontrolní součet |
Příklad:
# | formát | příklad | komentář |
---|---|---|---|
1 | hhmmss.sss |
170138.615 | Čas (UTC) |
2 | c |
A | Status (A=OK, V=varování) |
3 | ddmm.mmmm |
4912.2525 | Zeměpisná šířka |
4 | c |
N | Indikátor sever/jih (N=sever, S=jih) |
5 | ddmm.mmmm |
01635.0378 | Zeměpisná délka |
6 | c |
E | Indikátor východ/západ (E=východ, W=západ) |
7 | d.d |
0.04 | Vodorovná rychlost (Speed Over Ground, v uzlech) |
8 | d.d |
16.43 | Kurz pohybu ve stupních |
9 | ddmmyy |
280705 | Datum ddmmyy |
10 | d.d |
N.A. | Magnetická deklinace ve stupních |
11 | c |
N.A. | Indikátor východ/západ (E=východ, W=západ) |
12 | *xx |
32 | Kontrolní součet |
Množství údajů závisí na počtu viditelných družic. Jedna věta může obsahovat nejvýše 80 znaků, což vystačí pouze k uložení dat týkajících se nejvýše čtyř družic. Informace proto bývá rozdělena do několika dílčích vět.
Příklad (trojice vět):
# | formát | příklad | komentář |
---|---|---|---|
1 | d |
3 | Celkový počet vět (číslují se od 1) |
2 | d |
1 | Číslo aktuální věty (taktéž se čísluje od 1) |
3 | dd |
11 | Počet viditelných družic |
4 | dd |
09 | Identifikační číslo družice |
5 | dd |
84 | Úhlová výška, kde se daná družice nachází |
6 | ddd |
297 | Azimut, kde se daná družice nachází |
7 | dd |
41 | Odstup signálu od šumu (SNR - Signal to Noise Ratio). Je-li tento údaj roven nule, nelze daný satelit využít k výpočtu polohy. Nejčastěji proto, že je zastíněn. |
… | … | … | Podle počtu viditelných družic mohou následovat další čtveřice údajů (4-7) |
n | *xx |
74 | Kontrolní součet |
Příklad:
# | formát | příklad | komentář |
---|---|---|---|
1 | hhmmss.sss |
170139.615 | Čas (UTC), pro který platí údaje o vypočtené pozici |
2 | ddmm.mmmm |
4912.2526 | Zeměpisná šířka |
3 | c |
N | Indikátor severní/jižní šířka (N=sever, S=jih) |
4 | dddmm.mmmm |
01635.0378 | Zeměpisná délka |
5 | c |
E | Indikátor východní/západní délky (E=východ, W=západ) |
6 | d |
1 | Indikátor kvality: 0 — nebylo možno určit pozici 1 — pozice úspěšně určena 2 — pozice úspěšně určena (diferenční GPS) |
7 | dd |
07 | Počet viditelných satelitů 00 — 12 |
8 | d.d |
1.0 | Vliv rozestavění družic na určení polohy HDOP (Horizontal Dilution of precision) |
9 | d.d |
357.5 | Výška antény nad geoidem |
10 | c |
M | Jednotka pro předchozí údaj (č.9) (M=metr) |
11 | d.d |
43.5 | Geoidal separation, rozdíl mezi WGS-84 zemským elipsoidem a střední úrovní moře (geoid). Znaménko mínus znamená, že střední úroveň země je pod elipsoidem. |
12 | c |
M | Jednotka vzdálenosti pro předchozí položku (č.11) (M=metr) |
13 | d.d |
0.0 | Stáří poslední aktualizace DGPS. Údaj je uváděn v sekundách. Jestliže údaj chybí, nepoužívá se DGPS. |
14 | dddd |
0000 | Identifikační číslo referenční stanice pro DGPS (0000 — 1023) |
15 | *xx |
7D | Kontrolní součet |
struct gpsData { char utc[10]; // UTC date / ve formátu mm/dd/yy char time[10]; //Hodiny ve formátu GMT hh:mm:ss double latitude_f; // Zeměpisná šířka v datovem typu double double longitude_f; //Zeměpisná délka v datovem typu double char latitude[12]; // Zeměpisná šířka char longtitude[12]; // Zeměpisná šířka char speed[12]; // Rychlost v knotech };Dále je zapotřebí napsat zdrojový kód pro ovládání sběrnice.
char gps_get_char() { unsigned int in = 0; do { in = uart_getc(); } while((in & UART_NO_DATA) || (in & UART_BUFFER_OVERFLOW)); return((char) in); }Nyní je zapotřebí vytvořit funkce pro zpracování GPS dat. funkce uint8_t get_GPS (char *find, char *GPSbuf) slouží k získání a kontrole dat z GPS modulu.
uint8_t get_GPS (char *find, char *GPSbuf) { uint8_t nLoop = 0; uint8_t rValue = 0; do { do { dat = gps_get_char(); } while ((dat != '$') && (dat != 0)); if (dat == 0) break; GPSbuf[0] = '$'; for (nLoop = 1; nLoop < 7; nLoop++) { dat = gps_get_char(); GPSbuf[nLoop] = dat; } } while ((strncmp(GPSbuf+0,find,6)!=0) && (dat != 0)); if (dat != 0) { while ((dat !='\n') && (dat != 0)) { dat = gps_get_char(); GPSbuf[nLoop++]= dat; } if (dat != 0) rValue = 1; // if process complete -> return True; } GPSbuf[nLoop] = '\0'; return rValue; }
static char *field(char *string, short n) { static char result[100]; char *p = string; while (n-- > 0) { while (*p++ != ','); strcpy(result, p); p = result; while (*p && *p != ',' && *p != '*' && *p != '\r') { p++; } } *p = '\0'; return result; }Poslední funkcí je zpracování a získání dat z GPS modulu.
void processGPRMC(char *string) { char s[20], d[20]; memset (s, 0, sizeof s); sscanf(field(string, 9), "%s", d); // Datum: ddmmyy strncpy(s, d , 2); // Kopírovani roku strncpy(s + 2, d + 2, 2); //Kopírování datumu strncpy(s + 4, d + 4, 2); strcpy(gNMEAdata.utc, s); memset (s, 0, sizeof s); sscanf(field(string, 1), "%s", d); // Čas: hhmmss.sss strncpy(s + 0, d, 6); //Kopíruj hodiny minuty sekundy strcpy (gNMEAdata.time,s); sscanf(field(string, 7), "%lf", &gNMEAdata.speed); sscanf(field(string, 3), "%s", gNMEAdata.latitude); sscanf(field(string, 5), "%s", gNMEAdata.longtitude); }Pro zobrazení dat stačí jen zavolat předchozí funkci.
processGPRMC (buf);
//nyní stačí jen nějákým způsobem vypsat proměnné. (nebo je možné je vypsat na LCD)
printf ("\r%s,%s,%c,%s,%s",
gNMEAdata.utc,
gNMEAdata.time,
gNMEAdata.status,
gNMEAdata.latitude,
gNMEAdata.longtitude
);