Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 mar 2024, o 15:21


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 4 gru 2017, o 19:44 
Offline
Nowy

Dołączył(a): 04 gru 2017
Posty: 3
Pomógł: 0

Witam,
Proszę o wybaczenie, jak pewnie można zauważyć, jestem nowy na forum.Jestem Przemek i studiuję elektronikę i telekomunikację na Politechnice Śląskiej.
Aktualnie pracuję nad projektem wysokościomierza z datą i współrzędnymi geograficznymi opartym na module GPS.

Mam problem z kodem.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dane otrzymane po UARCIE zapisuję do tablicy NMEA_CODE, a następnie w funkcji parse_data, fragmentuję otrzymane dane. I tu zaczyna się problem:
globalne tablice char, tracą zawierające dane. Dane są dostępne jedynie przez chwilę, gdy zostanie spełniony warunek:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




Pozdrawiam.



Ostatnio edytowano 4 gru 2017, o 20:30 przez fiery149, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2017, o 20:18 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

Ja rozumiem, że można na gwałt szukać rozwiązania ale to chyba nie zwalnia z podstawowych zasad kultury i choćby przy pierwszym swoim poście wypadałoby się przedstawić i dodać kilka słów więcej. A nie rachu ciachu i dajcie mi odpowiedź.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2017, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Dlaczego parsujesz dane cyklicznie bez czekania na pojawianie się ich w buforze?
Także metoda kopiowania danych między buforami w przerwaniu odbioru nie jest elegancka.

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 2 minutach ]

Dodatkowo break w miejscu w default przy odbiorze wygląda bardzo nieprofesjonalnie.

Jaki masz format danych? Bo końcem u Ciebie jest dowolny znak po znaku *.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2017, o 21:13 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

Polecam książkę:

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

i zapoznanie się z PODSTAWAMI obsługi komunikacji UART w oparciu o bufory cykliczne - bo to co teraz kolega robi to po prostu tzw masakra - i nie dziwota że dane się "gubią"

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2017, o 21:18 
Offline
Nowy

Dołączył(a): 04 gru 2017
Posty: 3
Pomógł: 0

rskup napisał(a):
Dlaczego parsujesz dane cyklicznie bez czekania na pojawianie się ich w buforze?
Także metoda kopiowania danych między buforami w przerwaniu odbioru nie jest elegancka.


Właśnie poprawiłem

rskup napisał(a):

Jaki masz format danych? Bo końcem u Ciebie jest dowolny znak po znaku *.


Dane odbieram w standardzie NMEA. Głównie szukam podobnego do tego ciągu:
"$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2017, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

fiery149 napisał(a):
Dane odbieram w standardzie NMEA. Głównie szukam podobnego do tego ciągu:
"$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"
Na końcu ciągu masz znak CR lub LF (znaki końca linii). A ty kończysz na znaku następnym po *. Dlaczego?

Mirek napisał dobitniej na temat obsługi buforów przy odbiorze. Dobrze abyś to także popoprawiał.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2017, o 11:45 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

taką bibliotekę kiedyś zrobiłem - zobacz może Ci się przyda
http://forum.atnel.pl/topic13744.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2017, o 15:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2012
Posty: 97
Lokalizacja: Tarnów
Pomógł: 2

Na twoim miejscu całkiem przerobiłbym ten kod zgodnie ze wcześniejszymi sugestiami.
Najlepiej było by zastosować bufor cykliczny ale jeśli nie chcesz się w to bawić możesz zrobić prościej,
stworzyć bufor do odbioru danych od modemu GPS i do niego ładować nadlatujące dane po uarcie, ale zaczekaj z analizą dopóki nie odbierzesz całej komendy. To że odebrałeś komendę rozpoznasz po odebraniu znaku CR lub LF (nie pamiętam który występuje pierwszy, musisz sobie to sprawdzić). Dopiero po odebraniu jednego z tych znaków czy nawet obu w obsłudze przerwania ustaw sobie jakąś flagę, którą będziesz sprawdzał w pętli głównej. Jeśli będzie ona ustawiona to wtedy użyj funkcji strstr żeby wyszukać ciąg znaków $GPGGA. Funkcja strstr zwróci ci wskaźnik będący adresem pod którym zaczyna się znaleziony ciąg znaków. Wykorzystaj ten wskaźnik żeby "przelecieć" po kolei ten bufor i wycinać interesujące cię dane tj. długość geograficzną, szerokość, kierunek , czas, co tam potrzebujesz. Zwróć uwagę że każda z tych informacji jest oddzielana przecinkiem. Żeby mieć pewność że "wycinasz" właściwe dane najlepiej jest ich używać do "nawigacji" np. czas jest zawsze po 1 przecinku, po drugim jest pierwsza współrząędna, po trzecim półkula N lub S itd. Wycinanie danych po indeksie tablicy jest ryzykowne bo nie zawsze ci się to może powtórzyć np. kiedy GPS nie złapał jeszcze fix'a dostaniesz komendę $GPPGA gdzie będzie dużo "pusty" przecinków, wtedy możesz wycinać "śmieci" zamiast rzeczywistej pozycji. Po takim przeskanowaniu możesz wyczyścić bufor i czekać na kolejną linię tekstu od modemu. Komendy wysyłane są nie częściej niż co sekundę więc spokojnie powinieneś się wyrobić, ewentualnie na czas analizy danych zawartych w buforze możesz sobie zablokować odbiór nowych danych, nie musisz pobierać każdej komendy chyba że dla twojego urządzenia jest to konieczne. Powodzenia. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 gru 2017, o 21:05 
Offline
Nowy

Dołączył(a): 04 gru 2017
Posty: 3
Pomógł: 0

Dziękuję wszystkim za podpowiedzi. Prawie całkowicie przerobiłem kod i już wszystko działa jak należy.

Jeszcze raz dzięki i pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 10 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO