Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] ATmega32 z GPS - czytanie danych NMEA, język C

10 Wrz 2019 23:07 126 2
  • Poziom 26  
    Witam,
    Mam problem dotyczący odczytu danych z modułu GPS. Protokół NMEA (GGA oraz RMC). Piszę trochę w C, ale nie czułem się na tyle dobrze z obsługą tego, więc skorzystałem z przykładu. Rozumiem co dzieje się w kodzie, ale program się zawiesza lub zapętla. Wydedukowałem, że problemem jest pętla for w funkcji get_gpstime(). Tak jakby kontroler nie rozpoznawał przecinka, albo się zapętla. Czy ktoś mógłby mi podpowiedzieć jak poprawić kod? Byłbym bardzo wdzięczny. Buduję dozymetr z zapisem pomiaru i wysokości na kartę SD do sondy stratosferycznej. Obsługa GPS jest mi niezbędna. Z rozwinięciem kodu sobie poradzę. Poniżej zamieszczam kod. Proszę się nie przejmować Portem A. Podpiąłem pod niego diody, aby zobaczyć gdzie program się zatrzymuje (takie pułapki na szybko).
    Tak u mnie wyglądają ramki, żeby nie było wątpliwości.
    ATmega32 z GPS - czytanie danych NMEA, język C

    Ogólnie, to zaczynam przerabiać kod na wyświetlacz 2x16, żeby sprawdzić poprawność programu. Docelowo nie będzie lcd. Cały projekt jest dostępny tutaj
    GPS.rar Download (119.22 kB)
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Z góry dziękuję za pomoc. Pozdrawiam
  • Pomocny post
    Poziom 23  
    Kod: c
    Zaloguj się, aby zobaczyć kod


    1) Szalenie ryzykowna pętla, gdy przyjdzie jakiś inny string bez przecinka lub ciąg znaków do przecinka przekroczy wielkość bufora Time_Buffer, będziesz pisać po za tablicę. Należało by dodać wykrywanie osiągnięcia maksimum rozmiaru tablicy

    2) Skopiujesz string, który powinien być terminowany zerem, bo w przeciwnym wypadku, używając później atol(Time_Buffer) możesz otrzymać coś niespodziewanego.

    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 26  
    Dzięki za podpowiedzi! Rzeczywiście pętla była ryzykowna. Poprawiłem wszystkie pętle w programie. Teraz wszystko działa jak należy.