LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

ZL27ARM: współpraca z odbiornikiem GPS z modułu KAmodGPS

Po wywołaniu funkcja czeka na kolejny znak i po odebraniu zwraca go w celu przetworzenia w dalszej części programu:

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_Clear();		
		LCD_GoTo(0,1);		
		LCD_SendText((u8*)N); 	//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_SendText((u8*)E);		//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;	
	
//Z powrotem 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		
}