Tomáš Götthans, UREL, FEEC, VUT Brno
xgotth00
stud.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
);

