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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 23 maja 2025, o 11:55


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
    Autor Wiadomość
    PostNapisane: 3 mar 2022, o 11:08 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    Witam.
    Mam problem z konwersją danych .
    Po UART przylatują dane do sterownika z wartościami szasnastkowymi.
    Problem pojawia sie gdy chcę z char przerobić wartość na liczbową typu uint16t
    Funkcja atoi działa dla liczb dziesiętnych,
    jakiej innej funkcji użyć żeby zmienna liczbowa zapisała sie w systemie szesnastkowym?

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 12:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 26 sty 2016
    Posty: 1171
    Lokalizacja: Kraków
    Pomógł: 93

    A w jakiej formie przylatują dane? Liczby bitowo? Znaki ASCII?
    Na dobrą sprawę czy liczbę wyświetlasz szesnastkowo, dziesiętnie czy bitowo, w pamięci jest zapisana w ten sam sposób



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 13:22 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    raczej jako znaki ASCII,ale nie mam pewności.
    Korzystam z biblioteki Pana Mirka MULTI UART

    przykładowo jesli przyleci 7F ,to już sie robi problem ,bo to nie liczba dziesiętna i funkcja atoi nie przekonwertuje to na liczbę w systemie hex
    potem moja funkcja maskowania bitów ,żeby odczytać interesujące mnie bity nie ma prawa wyświetlić prawdziwe dane bo jest problem w samej zamianie zmiennych z char na uint

    ręcznie podstawiałem wartości zmiennej hex , maskowanie działa tak jak powinno



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 16:33 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2595
    Pomógł: 128

    Wklej przykładową ramkę. Są czymś oddzielone? Np przecinkami, CR/LF?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 18:24 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    wartości oddzielone spacją


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


    z pozyskaniem odpowiedniej wartości na 3 nie mam problemu,
    Z komputera przesyłam na razie na sucho tylko wartość np 7F
    nawet w kodzie na sztywno przypisałem wsk=7F i tak to nic nie daje
    problem jest ewidentnie w zamianie wartości char na uint



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 18:50 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Znaki jakie są w uart są 8bit więc jakie przychodza nie ma znaczenia czy to system 10tny czy 16tkowy czy 2kowy, dalej to jest 8bit (1bajt)

    Sprobuj tak (uint16_t) hex = (uint8_t) atoi(wsk)

    Chodzi o jawne rzutowanie, bo brak robi miszmasz typów.

    char to to samo co uint8_t



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 19:35 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    A z komputera (terminala) wysyłasz jako ascii czy hexadecimal
    Bo to co napisałeś że znaki oddzielone spacjami to znaki ascii i np 00 7f to przy wysyłaniu w trybie ascii 00spacja7f a w hex 00207f (null20127)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 20:47 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    Szofer napisał(a):
    Znaki jakie są w uart są 8bit więc jakie przychodza nie ma znaczenia czy to system 10tny czy 16tkowy czy 2kowy, dalej to jest 8bit (1bajt)

    Sprobuj tak (uint16_t) hex = (uint8_t) atoi(wsk)

    Chodzi o jawne rzutowanie, bo brak robi miszmasz typów.

    char to to samo co uint8_t



    nic to nie zmieniło, nadal funkcja atoi wartości od 0 - 9 konwertuje , a jesli pojawi sie od A do F to wartość zmiennej hex =0

    ------------------------ [ Dodano po: 1 minucie ]

    Szofer napisał(a):
    A z komputera (terminala) wysyłasz jako ascii czy hexadecimal
    Bo to co napisałeś że znaki oddzielone spacjami to znaki ascii i np 00 7f to przy wysyłaniu w trybie ascii 00spacja7f a w hex 00207f (null20127)


    wysyłane jest ze spacjami, ale to już pominąłem , wysyłam tylko pojedyńcze wartości np 7F



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 20:54 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    To by znaczyło że wysyłasz ascii z terminala i laczysz 2 znaki, myślę że źle wysyłasz znaki z terminala

    Popatrz w tabeli ascii, hmm bo jak wysyłasz 0-9 to w zmiennej hex też masz wartość liczbową 0-9? Bo znaki A-F mają dec w ascii inne niż 0

    Musisz na 100% być pewny w jakiej postaci wysyłasz 1bajt z terminala



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 21:23 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

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


    na razie pomińmy kwestię jak to jest z terminala wysyłane
    teraz w kodzie na sztywno przypisałem dla wsk = "a"
    w ten sposób wartość hex dalej jest 0, przypisując dla wsk 1-9 wartość zmiennej hex jest także 1-9



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 mar 2022, o 22:04 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    A wpisz w wsk zakres z liczb 0-255, i spójrz na wynik,

    Wtedy już sam zobaczysz oco chodzi w atoi



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 00:18 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2595
    Pomógł: 128

    Sentencja wysłana w ASCII: 007F00 to w hexie będzie to 6 bajtów: 0x30, 0x30, 0x37,0x46, 0x30, 0x30



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 09:03 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    micky napisał(a):
    Sentencja wysłana w ASCII: 007F00 to w hexie będzie to 6 bajtów: 0x30, 0x30, 0x37,0x46, 0x30, 0x30
    Dobrze, takie znaki z terminala muszą wylecieć ale to musi być hex,
    Ale kolega kaskadertd wysyła to jako ascii i atoi "x" zamieni na 0...
    w ascii to będzie:
    00
    127
    00



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 12:31 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    Funkcja atoi zamieni liczby od 0-255 , z tym nie ma problemu. cały problem w tym jak odczytać prawidłowo te dane...
    może w jakiś sposób wartość np 7F rozdzielić na dwie części... 7 to liczba to nie będzie problemu, a znaki jakimś zwykłym if'em rozpoznawać...
    Jakieś propozycje ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 13:03 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    W jakiej formie będą przychodzić znaki
    Jesli nie ascii to atoi wywal I będzie ok



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 14:00 
    Offline
    Nowy

    Dołączył(a): 09 kwi 2014
    Posty: 7
    Pomógł: 0

    własnie dane są odbieranie w formie ascii



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 mar 2022, o 14:15 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    kaskadertd napisał(a):
    własnie dane są odbieranie w formie ascii
    To w obsłudze uart możesz poprzes switch-case zamieniac litery na int lub ascii, ale musisz sobie dołożyć pętle for do "dopisania" znaków ascii do bufora albo obsługiwać znak po znaku z bufora, metod jest wiele...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 mar 2022, o 12:24 
    Offline
    Moderator
    Avatar użytkownika

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

    kaskadertd napisał(a):
    własnie dane są odbieranie w formie ascii

    Ja bym jednak zaczął naukę C od podstaw - to wtedy mnóstwo by się wyjaśniło - bo aż ciężko słuchać co się dzieje w tym wątku

    polecam książkę

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

    a póki co to obejrzyj Pan ten poradnik wideo (bo widzę, że kompletnie ale to kompletnie jak na razie to nie orientujesz się ani w języku C ani nie rozumiesz co to znaki ASCII, co to komunikacja binarna i z tego powodu nawet nie wiesz jak to określić - a przez to oczywiste, że masz problem z konwersją - skoro nawet nie możesz ustalić czy przekazać w ogóle z jaką komunikacją masz do czynienia)



    mam nadzieję, że to ci chociaż troszkę rozjaśni

    _________________
    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: 6 mar 2022, o 21:19 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 paź 2014
    Posty: 233
    Lokalizacja: Rzeszów
    Pomógł: 11

    Przyznam się, że czytając ten wątek trochę się pogubiłem. Jednak przy tak prostych konwersjach dlaczego nie napiszesz własnej funkcji, tylko na siłę próbujesz użyć funkcji bibliotecznych?

    _________________
    Mr. Nobody



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: tadeuszgr1 i 7 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