Parsowanie oraz wysyłanie danych AVR-GPS

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
maxxxior
Użytkownik
Posty: 210
Rejestracja: 19 mar 2010, 21:27
Lokalizacja: Skierniewice

Parsowanie oraz wysyłanie danych AVR-GPS

Post autor: maxxxior » 19 maja 2014, 12:58

Witam,
Chcę sobie stworzyć lokalizator GPS. Układ ma wysyłać za pomocą modułu GSM, sms-em dane o aktualnej pozycji. GPS to FGPMMOPA6h a procesor to Atmega64. Na razię chcę sparsować wysyłane ramki z GPS'a do PC i wyświetlić tylko szerokość i długość geograficzną. I tu pojawia się problem. Napisałem prosty kod i jakoś tam to wysyła, lecz gubi znaki, i czasami co trzeci czwarty transfer wysyła śmieci. Mógłby ktoś się podzielić kodem w C do parsowania ramek z GPS? Bądź napisać krok po kroku jak to ma się odbywać?
Oto mój kod:

Kod: Zaznacz cały

#include <avr/io.h>
#include <inttypes.h>
#include <util/delay.h>
#include <stdio.h>
#define FOSC 2000000// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
 
 
void USART1_Init(unsigned int ubrr1) {
	// wyliczenie UBRR dla trybu asynchronicznego (U2X=0)
	//uint16_t _ubr = 0x0006;
	//uint16_t _ubr_UART1 = (F_CPU / 16 / baud1 - 1);
	// ustawienie prÓdkoŁci
	UBRR1H = (uint8_t) (ubrr1 >> 8);
	UBRR1L = (uint8_t) ubrr1;
	// za-Žczenie nadajnika i odbiornika
	//UCSR1B = (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1); //z przerwaniami
	UCSR1B = (1 << RXEN1) | (1 << TXEN1);
	// ustawienie formatu ramki: 8 bitíw danych, 1 bit stopu
	//UCSR1C = 0;
	UCSR1C = (3 << UCSZ10);
}
 
unsigned char USART1_Receive(void) {
	/*
	 Wait for data to be received
	 */
	while (!(UCSR1A & (1 << RXC1)))
		;
	/*
	 Get and return received data from buffer
	 */
	return UDR1;
}
 
void USART1_Transmit(unsigned char data) {
	// czekaj aČ bufor nadawczy bÓdzie pusty
	while (!(UCSR1A & (1 << UDRE1)))
		;
	// wrzuŐ dane do bufora nadawczego, start transmisji
	UDR1 = data;
}
 
void wyslij_slowo_UART1(const char *s) {
	while (*s)
		USART1_Transmit(*s++);
}
 
int main(void) {
	unsigned char GPGGA[83], bufor_UART1[83];
 
	USART1_Init(MYUBRR);
 
	while (1) {
 
		for (int i = 0; i < 82; i++) {
			bufor_UART1[i] = USART1_Receive();
		}
 
		for (int x = 0; x < 82; x++) {
			if (bufor_UART1[x] == 'G' && bufor_UART1[x + 1] == 'G'
					&& bufor_UART1[x + 2] == 'A') {
				for (int y = x + 15; y < x + 39; y++) {
					GPGGA[y] = bufor_UART1[y];
 
					USART1_Transmit(GPGGA[y]);
 
				}
 
			}
 
		}
 
		USART1_Transmit('\r');
		USART1_Transmit('\n');
 
		_delay_ms(3000);
 
	}
 
}
wiem że ten kod jest niepoprawny, ale nie mogę nic innego wymyślić. Próbowałem już na kilka sposobów i nic nie wychodzi :/

Druga sprawa, to wykonanie obliczeń matematycznych na szerokosci i dlugosci wysyłanych przez GPS. Otóż później (po odpowiednim rzutowaniu czy coś, właśnie nie wiem na co i jak to przekonwertować) chciałbym szer o dł. podzielić przez 100 i następnie część ułamkową przez 0.6 aby wynikowa pozycja była odpowiednia do wpisania w google maps.
Będę bardzo wdzięczny za wszelaką pomoc.

ODPOWIEDZ