logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega128][C] - Niepoprawne odbieranie danych przez GPS

Bubu_PL 02 Sie 2012 20:28 2019 14
REKLAMA
  • #1 11169738
    Bubu_PL
    Poziom 11  
    Witam!
    Borykam się z następującym problemem.
    Przez USART1 pobieram dane z GPS i chce je przesłać dalej za pomocą USART0 (tymczasowo).

    Problem w tym, iż nie zawsze działa pobieranie odpowiedniej ramki ($GPRMC)
    Zrzut ekranu i kod programu poniżej..
    proszę o jakieś wskazówki.

    Przerwania dla USART wydaje mi sie że działają poprawnie, dlatego nie załączam kodu obsługi USART.

    gps.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [Atmega128][C] - Niepoprawne odbieranie danych przez GPS [Atmega128][C] - Niepoprawne odbieranie danych przez GPS
  • REKLAMA
  • #2 11169810
    LordBlick
    VIP Zasłużony dla elektroda
    Bubu_PL napisał:
    Przerwania dla USART wydaje mi sie że działają poprawnie, dlatego nie załączam kodu obsługi USART.
    Przerwania same w sobie muszą działać poprawnie, jeśli tylko procesor jest sprawny i taktowanie, i zasilanie poprawne. Tym niemniej kod obsługi przerwania może zawierać błędne założenia, które mogą być przyczyną.
  • #3 11169841
    Bubu_PL
    Poziom 11  
    Tutaj przyklad ze czasami dziala poprawnie:
    [Atmega128][C] - Niepoprawne odbieranie danych przez GPS
  • REKLAMA
  • #4 11169905
    LordBlick
    VIP Zasłużony dla elektroda
    A obsługa bufora nie idzie w krzaczki ? Nie widzę porównywania z UART[01]_RX_BUF_SIZE/UART[01]_TX_BUF_SIZE, a jak rozumiem ma być to bufor cykliczny, czyli Tail(Ogon) goni Head(Głowa), pod koniec bufora wskakując znów na jego początek. Osobiście używam tylko "głowy" i licznika znaków w buforze.
    Ten delay 1s uważam za zbędny, lepiej uwarunkować odsyłanie do PC klasyfikacją ilości odebranych znaków.
  • #5 11170088
    Bubu_PL
    Poziom 11  
    Czyli UART[n]_RX_BUF_SIZE oraz UART[n]_TX_BUF_SIZE muszą być takie same dla UART1 i UART2?
  • #6 11170190
    LordBlick
    VIP Zasłużony dla elektroda
    Bubu_PL napisał:
    czyli UART[n]_RX_BUF_SIZE oraz UART[n]_TX_BUF_SIZE muszą być takie same dla UART1 i UART2?
    Tego nie twierdzę, moga być różne, tylko przy obsłudze musisz stwierdzić moment, ze któryś ze "wskaźników" dotarł na fizyczny koniec bufora i powinien wskazywać fizyczny początek, bo inaczej zostaną nadpisane ewentualne następujące po tym buforze dane.
    Bubu_PL napisał:
    Obsługa UART zaczęrpnięta z książki Pana Mirosława.
    Każdy sposób jest dobry, jeśli prowadzi do rozwiązania. No to pan Mirosław jest proszony do tablicy... ;)
  • #7 11170611
    spinlock
    Poziom 11  
    To jest mój pierwszy post więc witam wszystkich :D

    Do autora wątku w funkcji GPS_RX() na początku czyścisz bufor gps_buff ale jeżeli zachodzi warunek:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to nie uzupełniasz tego bufora i po wyjściu z funkcji GPS_RX() jest on pusty.

    Może żeby zdebugować zapisz pierwszy bajt tego bufora np. znakiem X jeżeli ten warunek nie zachodzi.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]
  • #8 11170689
    LordBlick
    VIP Zasłużony dla elektroda
    spinlock napisał:
    To jest mój pierwszy post więc witam wszystkich :D
    Gratuluję wyjścia z cienia... ;)

    spinlock napisał:
    Do autora wątku w funkcji GPS_RX() na początku czyścisz bufor gps_buff ale jeżeli zachodzi warunek:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to nie uzupełniasz tego bufora i po wyjściu z funkcji GPS_RX() jest on pusty.
    Jeżeli zachodzi ten warunek to dalsze dane są kopiowane.
    P.S. W międzyczasie się wyjaśniło, tak jak przypuszczałem obsługa bufora cyklicznego wymaga dopracowania.
    Edit: Dla niezorientowanych - wyjaśniam - zapewne Pan Mirosław, jaki i Bubu_PL doszli do porozumienia, w wyniku czego kwestionowane, ale istotne w dyskusji fragmenty kodu zostały usunięte przez "Tematodawcę". W związku z tym za istotne uznałem ożywić dyskusję w temacie podklejonym.
  • REKLAMA
  • #9 11171435
    spinlock
    Poziom 11  
    Czyli problem rozwiązany ?

    Cytat:
    Jeżeli zachodzi ten warunek to dalsze dane są kopiowane.


    A jeśli nie zachodzi ten warunek to bufor gps_buff jest pusty i na terminal jest wysyłany text:

    Cytat:
    Bufor GPS:


    Jest kolega pewny że zawsze ten warunek jest prawdziwy ?
    Bo jeżeli tak to po co sprawdzać. :D

    PS: Widzę że jakiś "strażnik własności intelektualnej" (pewnie jakiś bot) usunął z wątku kod UART-a ponieważ "stanowi on integralną część książki".
  • #10 11171870
    LordBlick
    VIP Zasłużony dla elektroda
    spinlock napisał:
    Jest kolega pewny że zawsze ten warunek jest prawdziwy ?
    Skąd takie przypuszczenie ?
    spinlock napisał:
    Bo jeżeli tak to po co sprawdzać. :D
    Bez sprawdzania wykonywanie czynności kopiowania pójdzie w krzaczki... Mam nadzieję, że rozwiałem wątpliwości...
  • #11 11171922
    Bubu_PL
    Poziom 11  
    Witam ponownie :)
    Zmodyfikowałem conieco kod:
    main.c
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    do Usart1.c dodałem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Efekt:
    
    $GPGSA,A,3,02,25,04,12,14,31,29,27,,,,,1.82,0.94,1.56*0D
    $GPRMC,115944.000,A,5210.2515,N,02100.3448,E,0.13,203.04,030812,,,A*60
    $GPVTG,203.04,T,,M,0.13,N,0.25,K,A*3D
    $GPGGA,115945.000,5210.2515,N,02100.3448,E,1,7,1.06,137.7,M,39.1,M,,*55
    $GPGSA,A,3,02,25,04,12,14,31,27,,,,,,1.90,1.06,1.58*01
    $GPRMC,115945.000,A,5210.2515,N,02100.3448,E,0.13,203.04,030812,,,A*61
    $GPVTG,203.04,T,,M,0.13,N,0.24,K,A*3C
    $GPGGA,115946.000,5210.2515,N,02100.3447,E,1,7,1.06,137.7,M,39.1,M,,*59
    

    I jak teraz powinienem dzialac? jakies wskazowki? Zapisanie do bufora np. GPGGA_Data i potem parsowanie? hm?
  • #12 11171996
    spinlock
    Poziom 11  
    Cytat:
    Skąd takie przypuszczenie ?

    Chyba się nie zrozumieliśmy ale właśnie zauważyłem że to przez mój błąd w pierwszym poście bo miałem na myśli sytuacje kiedy warunek tej pętli nie zachodzi.
    Szkoda że panowie pewnie doszli do porozumienia poza forum i nie podzielą się rozwiązaniem problemu.
  • #13 11172035
    Bubu_PL
    Poziom 11  
    Ja ciągle walczę i post wyżej napisałem na jakim jestem etapie:)
  • #14 11172115
    spinlock
    Poziom 11  
    Szanowny autorze "zniknął" kod UART-a w tym wątku i nie ma jak się odnieść do Twoich poprawek w kodzie.
  • REKLAMA
  • #15 11179401
    BubuPL
    Poziom 11  
    zrobiłem sobie troszeczkę ładniejszą obsługę całego programu.
    Niestety, pierwszy raz działa:
    $GPGGA201529.000||5210.2440N||02100.3153E||1||8||136.5||027.9||SEND SMS$GPGSA

    i tutaj stoi...

    kod main:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    kod gps:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    co się dzieje?
    [EDIT]
    rozwiązanie dla potomnych :)
    w przerwaniu ISR dodałem warunek sprawdzajacy czy GPS_Block jest 0, jeśli jest zaipsuje dane do bufora cyklicznego normalnie, jak jest 1 to olewam :)

    Czy to jest rozwiązanie zgodne ze sztuką?
REKLAMA