30.05.2012
ZL27ARM: obsługa odbiornika GPS L50 firmy Quectel
Szerokość oraz długość geograficzna są odczytywane w pliku main.c za pomocą pokazanej poniżej funkcji getch().
char getch(void) { char tmp; while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); tmp = USART_ReceiveData(USART1); return tmp; }
Po wywołaniu funkcja czeka na kolejny znak i po odebraniu zwraca go w celu przetworzenia w dalszej części programu:
LCD_WriteTextXY("Czekaj",7,0); //W oczekiwaniu na satelity while( ( temp[0] = getch() ) != '$'); //Jeśli pierwszy znak '$' to for(i = 0; i < 5 ; i++) temp[i] = getch(); //Odczytaj kolejnych 5 znaków if( strncmp(temp, GPGGA, 5) ) //sprawdź czy komenda GPGGA { for(i = 0; i < 14 ; i++) //Jeśli tak - pomiń godzinę i zbędne dla nas informacje temp[0] = getch(); for(i = 0; i < 11; i++) N[i] = getch(); //Zapisz do N[] szerokosc geograficzną N[i+1] = '\0'; temp[0] = getch(); //Pomin "," for(i = 0; i < 12; i++) E[i] = getch(); //Zapisz do E[] dlugosc geograficzna E[i+1] = '\0'; //Jesli szerokosc geograficzna prawidlowo odczytana //Jesli jestesmy nad rownikiem to mamy szerokosc polnocna(N) //Ponizej rownika jest szerokosc poludniowa (S) if(N[10] == 'N'||N[10]=='S') { //Zamien format N[] z DM na DMS i przygotuj N[] do wyswietlenia PrzeliczN(); LCD_WriteTextXY((unsigned char*)N,3,0) //Wyswietl N[]; } LCD_GoTo(1,2); //W drugiej lini //Jesli dlugosc geograficzna odczytana poprawnie //Na wschod od poludnika Greenwich jest dlugosc wschodnia(E) //Na zachod od poludnika Greenwich jest dlugosc zachodnia(W) if(E[11] == 'E'||E[11] == 'W') LCD_WriteTextXY((unsigned char*)E,4,1); //Wyswietl E[] } //Malo wydajna funkcja :)-Zmiana stringa N[] na float, wykonanuje mnozenie minut szerokosci geograficznej systemu DM przez 0.6 aby otrzymac //DMS i z powrotem zamienia float na string juz w formacie DMS //Ponizsza funkcja ma za zadanie zmienic format DM na DMS oraz ladnie sformatowac wynik do wyswietlenia. void PrzeliczN(void) { for(i=2;i<4;i++) Nm[i-2]=N[i]; //Odczytaj wartosc minut i zapisz do Nm[] Nm[2]=0x27; for(i=5;i<9;i++) Ns[i-5]=N[i]; //Odczytaj wartosc sekund i zapisz do Ns[] N[2]=0xDF; for (i=0;i<3;i++) N[i+3]=Nm[i]; //Zamien stringa na float i pomnoz * 6 //"-48" poniewaz zamieniamy z char-a na cyfre fLiczba=(((Ns[0]-48)*1000)+((Ns[1]-48)*100)+((Ns[2]-48)*10)+(Ns[3]-48))*6; //Zmiana float na string //oraz sformatowanie N[] do postaci jaka ma byc wyswietlona N[6]=(char) floor(fLiczba/10000)+48; fLiczba-=(N[6]-48)*10000; N[7]=(char) floor(fLiczba/1000)+48; fLiczba-=(N[7]-48)*1000; N[8]='.'; N[9]=(char) floor(fLiczba/100)+48; fLiczba-=(N[9]-48)*100; N[10]=(char) floor(fLiczba/10)+48; fLiczba-=(N[10]-48)*10; N[11]=(char)floor(fLiczba)+48; N[12]=0x22; N[13]='N'; N[14]='\0'; //Znacznik konca tekstu }