LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

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
}

 

Tagi: GPS, OLED, Quectel, UART