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



Teraz jest 25 lis 2024, o 23:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 10 gru 2012, o 21:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Witam, mam problem ze zliczeniem sumy kontrolnej, mianowicie mam do wyświetlenia ramkę GPS w standardzie NMEA. Ramka ta wygląda np. tak:

$GPGGA,,5224.960,N,01656.380,E,,,,100.0,M,,,,*47

Suma kontrola jest liczona od znaku $ do *, czyli w tym przypadku jest to liczba 47 (HEX). Pracuję na bibliotekach z książki Pana Mirka z lekcji 7 o UART. Jest tam funkcja uart_puts(). Chciałem ją wykorzystać do wyliczania tej sumy kontrolnej. Przerobiłem ją na coś takiego jednak nic mi się nawet nie wyświetla....


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


Z góry dzięki za pomoc i podpowiedzi. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2012, o 10:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 lis 2011
Posty: 582
Lokalizacja: okolice Wrocławia :)
Pomógł: 24

zlata_n napisał(a):
Witam, mam problem ze zliczeniem sumy kontrolnej, mianowicie mam do wyświetlenia ramkę GPS w standardzie NMEA. Ramka ta wygląda np. tak:

$GPGGA,,5224.960,N,01656.380,E,,,,100.0,M,,,,*47

Suma kontrola jest liczona od znaku $ do *, czyli w tym przypadku jest to liczba 47 (HEX).

Znaków $ i * nie zliczasz.

Według mnie suma kontrolna to 0e a nie 47.
Zresztą sprawdź sam:

Tu: http://www.hhhh.org/wiml/proj/nmeaxor.html

lub tu: http://siliconsparrow.com/nmeachecksum.php

Na C za bardzo jeszcze się nie znam :oops: ale zmienna Checksum powinna być typu unsigned char albo uint8_t.

Druga sprawa to taka że wyliczoną sumę otrzymujesz w HEX i musisz ją zamienić na stringa czyli w Twoim przypadku dwa znaki ASCII 0e, w HEX będzie to 30 (0) i 65 (e).

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2012, o 20:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Panowie dzięki za zainteresowanie, skorzystałem z podpowiedzi, zmieniłem i nadal nic, coś jest źle,mianowicie...

gdy stosuję ten kod:

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


a np. w main mam dla testu gotową ramkę do wyświetlenia...

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


w terminalu otrzymuję tylko:

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


Spróbowałem trochę inaczej, bo posiadam funkcję zamieniającą liczby z różnych systemów (BIN,DEC,HEX) na znaki ASCII do wyświetlenia. Za pomocą funkcji itoa.

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


jednak w tym przypadku dzieją się cuda na terminalu(dużo dziwnych przerw,pustych linijek) i cuda na wyświetlaczu dotykowym...Na terminalu jest mniej wiecej coś takiego:

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


Nie mam pojęcia co tu się dzieje...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2012, o 11:31 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Kod kolegi GwynBleidD jest dobry - sprawdziłem. Natomiast ty wywołując funkcję uart_putint doprowadzasz do wywołania uart_puts które z kolei ponownie wywołuje uart_putint itd. Ta rekurencja powoduje w efekcie przepełnienie stosu i błędne działanie programu.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2012, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Dzięki wielkie panowie, a szczególnie kolega "GwynBleidD". Wklepałem funkcję
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i wszystko ładnie się wysyła i wyświetla.

Jednak jak to zawsze bywa to nie koniec problemów. Mianowicie to dla mnie połowa sukcesu. Już opisuję mój problem. Projektuje układ-symulator ramek gps. Mam wyświetlacz LCD TFT 3.5'' z ofery Mirka z panelem dotykowym. I teraz wgrywam sobie mapkę, dotykam miejsce, odczytywane dane w postaci X i Y z wyświetlacza konwertuję na odpowiednią wartość długości i szerokości geograficznej. No i oczywiście na koniec formuję z tego ramkę. Jednak żeby mógł dynamicznie zmieniać(konwertować) dane z wyświetlacza posiadam taką funkcję. Jak ja mam to ugryźć do tej waszej funkcji ze zliczaniem sumy kontrolnej, której oczywiście potrzebuję do każdej generowanej ramki:

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


Do konwersji liczb na ASCII mam funkcję uart_putint(), którą muszę użyć. Jednak nie wiem jak do tak budowanej ramki GPS mam zastosować tą funkcję do zliczania sumy kontrolnej? da się w ogóle?

dzięki za podpowiedź i pomoc
Pzdr Jacek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 13:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Nie do końca zrozumiałem twoją odpowiedź "GwynBleidD". Mógłbyś dokładniej wyjaśnić? Mam stworzyć jednego stringa i tam wszystko pakować? A co z liczbami, które konwertuję?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 16:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Hmm nie wiem czy dobrze kombinuję, ale pomysł mam taki:
Chcąc wysłać całą ramkę, najpierw przerabiam wartości liczbowe na stringa do tablicy np.

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

I teraz tworzę tego głównego stringa:

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

Bo rozumiem, że w ten sposób da się później to wszystko ładnie przesyłać funkcją uart_puts_gpschecksum(), która zliczy sumę kontrolną i wypisze wszystko w terminalu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 16:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

No OK, ale nie wiem jak wrzucić tego stringa do OGÓLNEJ TABLICY ? jak go rozdzielić ?

Wrzucam to, rozumiem jak to działa ale niestety wyświetla się tylko : '$GPGGA,,'

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



Ostatnio edytowano 13 gru 2012, o 16:21 przez zlata_n, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 16:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Teraz wyświetla się tylko "GA,"
Gdy zmieniłem kod na:

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

Pojawia się już wynik ale nie w tej kolejności się wyświetla: "522$GPGGA"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 17:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Ehh.. próbuję na wszystkie sposoby i nie chce mi się dobrze wyswietlić.... nie wiem już co jest nie tak..

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


Nie rozumiem też tego zachowania kompilatora. Jeżeli damy taki prosty kod:

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


Na terminalu pokazuję się: "5$GPGGA,," Nie rozumiem dlaczego ta "5" wskakuje na początek!?


------------------------------------------------------------------------------------------

Sprawdziłem pewną zależność, mianowicie kiedy mam taki kod:
char string[10]; // bufor na wynik funkcji itoa np. [5,2,2,4]
itoa(szerokosc_czesc_calkowita,string, 10);
char tablica[20] = "$GPGGA";
uint8_t i=7;
char *c = string;
char s;
while((s = *c++)) tablica[i++] = s;
uart_puts(tablica);
to wszystko jest OK, wyświetla to co chcę: "$GPGGA5224", gdy tylko do tablicy wstawie "," to zaczynają się właśnie problemy z zamianą miejsc itd, minus jest taki, że potrzebuję tych przecinków...



Ostatnio edytowano 13 gru 2012, o 17:24 przez zlata_n, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 17:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

Właściwie to się zastanawiam co wy tu kombinujecie z tym zdaniem protokołu NMEA0183 przecież tu nic nie trzeba konwertować i kombinować dostajesz gotowy ciąg ASCII zdanie GGA z którego jasno wynika wszystko co potrzebujesz. Dodatkowo typowe moduły OEM GPS wysyłają po uarcie z parametrami: 8bitów danych, 4800 bodów, 1 bit stopu , bez parzystości.

Typowe zdanie GGA (Global Positioning System Fix DATA) które męczysz to np:

$GPGGA,133520,4807.038,N,1131.022,E,1,08,0.9,545.5,M,50.9,M,,*48

Co oznacza:

$ - znak początku zdania NMEA
GGA - kod polecenia
133520 - aktualny czas 13:35:20 UTC
4807.38,N - szerokość geograficzna 48 stopni 07,038' N
01131.022,E - długość geograficzna 11 stopni 31,022' E
1 - rodzaj sygnału użytego do pozycjonowania
08 - liczba satelitów z których odbieramy sygnał
0.9 - parametr określający dokładność położenia (ok 90m)
545.5,M - wysokość w metrach nad poziom morza
50.9,M - różnica miedzy geoidą, a elipsoidą WGS84
*48 - suma kontrolna CRC, która zawsze zaczyna się od znaku *

W przypadku modułów GPS OEM komunikacja jest zawsze jednokierunkowa i ograniczamy się jedynie
do odbierania danych z uarta i wyłuskiwaniem tego co nas interesuje, zwykle same dane położenia.
Dane te zwykle po podłączeniu GPS sa co sekundę wysyłane na uart automatycznie.

Do symulacji GPS wystarczy wysyłać łańcuch danych podobny do zdania GGA... suma kontrolna w większości urządzeń jest pomijana , a jedynie jest sprawdzane nadejście znaku $ oznaczającego początek zdania GGA
i następnie zliczane są znaki i ładowane do bufora , po czym szuka się wystąpienia N i E oraz na podstawie ich znalezienia (oznaczenie końca sekwencji położenia) pobierane są odpowiednie ilości znaków poprzedzających.


Autor postu otrzymał pochwałę

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Kolego SunRiver, ależ ja to wszystko wiem ;), niestety nie masz racji pisząc że suma kontrolna jest nie ważna, mam 2 programy do odbioru ramek GPS (NMEA) i żaden z nich ani nie drgnie jeśli nie wyśle się ramki ze zgodną sumą kontrolną. Ramek w tym systemie jest sporo, do najważniejszych zalicza się RMC, GGA, GSA i GLL. Sekwencja RMC (Recommended minimum of data) kreślana przez standard NMEA jako minimum danych, które musi wysyłać każdy odbiornik GPS. Dlatego wysyłam tylko taką ramkę:

$GPRMC,,5224.2450,N,03452.5030,E,,,,100.0,M,,,,*47

Kombinuję jak zrobić z tego ramkę, gdzie współrzędne są przeliczane w odpowiedniej funkcji, wszystko jest wrzucone do jednego stringa i potem ten string jest puszczany na funkcję kolegi "GwynBleidD" uart_puts_gpschecksum(), która zliczy sumę kontrolną i wypisze wszystko w terminalu. Taką ramkę dopiero poprawnie odbierze mój program i wskaże położenie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

To trzeba było tak od razu... dlaczego, dlatego że pracuje z modułami GPS od lat od strony sprzętowej i stąd taki właśnie post,
natomiast co do programów na pc nie wnikałem -- sporo natomiast korzystam z nawigowania po antycznych w sumie mapach bo z lat 32 - 47
ale nie o to chodzi ... w takim wypadku muszę poszukać bo gdzieś kiedyś popełniłem w VSC# symulator modułu GPS który wysyła prawidłowe
zdanie GGA na podstawie podanych danych o położeniu i wylicza też dla niego CRC. Był on konieczny do uruchamiania modułów bazowych dla systemów rejestrowania parametrów lotu, które projektowałem , ale nie można było sprawdzić działania bo moduły z GlobaSAT jeszcze były w drodze, a czas naglił ... -- program po wpisaniu danych pozycji N i E - wysyłał pełną ramkę zdania GGA oraz dla tego akurat przypadku
dane dodatkowe wymagane przez urządzenie:

Obrazek

Gdzieś to jeszcze widziałem na dysku w robocie , zapodam na droopa jutro poszukam
(żródła)

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 18:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Fajna sprawa, tylko że zbytnio nie będzie to dla mnie pomocne, ponieważ ja korzystam z wyświetlacza dotykowego na którym dotykam punkt, dostaje wartość X i Y i dalej to wszystko się dzieje. W tym przypadku chcę automatycznie po dotknięciu panelu wysłać ramkę przez RS232 do aplikacji w PC. Twój program jest spoko, ale musiałbym mu ręcznie podawać współrzędne, tak to zrozumiałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 18:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8587
Pomógł: 337

niestety tak ... , ale chodzi mi o sam algorytm dla odbiornika GlobalSAT obliczania sumy kontrolnej ... bo nie pamiętam jak to było
na pewno ci powiem, że początek zdania czyli znaki $GP nie są zaliczane do sumy kontrolnej, pisałem to kilka lat w wstecz ... niestety
teraz używam modułów HOPE... trochę inaczej tam wygląda Zdanie GGA , ale zawsze mam kilka pod ręką.

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 18:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Kolego SunRiver dzięki wielkie za wtrącenie się do tematu i zaproponowaniu pomocy i ciekawych opcji. Co do sumy kontrolnej to u mnie w ramce jest ona zliczana od znaku $ do *. To jest w sumie sedno tego tematu, lecz dzięki kolegom "GwynBleidD", "Sonix" i "Krauser" w postach wyżej udało się tą sumę już pięknie policzyć. Natomiast końcówką rozważania w tym temacie to już coś innego, mianowicie "Jak upakować wszystko do jednego stringa, tak aby łatwo się dało tam wstawić liczby, obliczyć sumę i wyświetlić całość w terminalu" ;) Czuje już w kościach, że już mam to prawie skończone ;)

GwynBleidD -> testuje cały czas i jest dobrze, już poprawnie się wysyła. Teraz buduję całą ramkę i chce wyświetlić. Dam znać jak wszystko ruszy ;) Pzdr

Z góry wielkie podziękowania dla was PANOWIE za pomoc. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2012, o 19:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 gru 2011
Posty: 97
Lokalizacja: Radomsko/Poznań
Pomógł: 0

Wszystko ładnie działa, udało się ;) :D
Funkcja budująca ramkę GPS w standardzie NMEA na podstawie podania mu szerokości i długości geograficznej przeliczonych odpowiednio na standard NMEA:

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

Teraz wystarczy, że w głównym pliku main i petli głównej wywołamy:

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

I na terminalu pokazują nam się pięknie chciane ramki GPS [NMEA] z obliczoną "w locie" checksumą.

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


Funkcja może nie jest najpiękniejsza. Może i da się ją jeszcze jakoś uprościć ale nie zajmuję aż tyle miejsca i co najważniejsze pracuje tak jak chciałem.
Dziękuję wszystkim za pomoc, w szczególności Mirkowi, który pomógł mi na starcie pominąć strasznie double'e i float'y.
Lecą dla każdego "pomógł" ;)
Pzdr Jacek.



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: 17 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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