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



Teraz jest 24 kwi 2024, o 11:05


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 ]
    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: 1148
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: 2562
Pomógł: 126

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 ]
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: 2562
Pomógł: 126

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: 27225
Lokalizacja: Szczecin
Pomógł: 1041

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ł: Brak zidentyfikowanych użytkowników i 5 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