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);
}
}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.