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



Teraz jest 19 kwi 2024, o 18:56


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 6 sty 2020, o 22:02 
Offline
Użytkownik

Dołączył(a): 14 kwi 2018
Posty: 35
Pomógł: 0

Witam,

próbuje dokonać konwersji mojej ramki danych dla przykładu są to tego typu dane przesłane jako ASCII:
50012544200255.
Jednak przy próbie konwersji dane początkowe zostają skonwertowane poprawnie, niestety pozostała część już nie.

Oto 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 oto efekt pracy w terminalu:
Obrazek

Jak widać wartość 5 oraz 1 zostają przekonwertowane poprawnie, następnie wartość 65555 również nie zostaje przekonwertowana, jednak gdy próbuje połączyć owe zmienne 8 bitowe w jedną 16-sto uzyskuje nie poprawny wynik. Co może być tego powodem?

Również udało mi się zauważyć, że końcowe dwa elementy 45 oraz 55 są poprawnie odczytane problem dotyczy tylko wartości ich poprzedzających.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 00:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Wejdź sobie na dowolną stronę z kompilatorem C np https://rextester.com/l/c_online_compiler_gcc
Wklej sobie ten kod poniżej, przeanalizuj, a później porównaj ze swoim.
Oczywiście to tylko fragment, odpowiednik Twojego kodu. Kolejne zmienne trzeba potraktować podobnie.

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


Dodam jeszcze, że powołujesz:
volatile char Data_buffer[14]; //tablica 14 elementowa
a tutaj:
Data_Ready = USART_Read(Data_buffer, 16);
dajesz 16? Rozumiem, że to 16 znaków?

Przyjęło się, że zmienne pisze się małymi literami. Łatwiej się analizuje kod. ;)

Te volatile i rzutowanie na const char* jest niepotrzebne. ;)

Daj znać czy sobie poradziłeś.
Pozdrawiam ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 00:36 
Offline
Użytkownik

Dołączył(a): 14 kwi 2018
Posty: 35
Pomógł: 0

Dziękuje bardzo za cenne rady, okazało się że pomogła zmiana typu z uint8_t na uint16_t tablic które posiadały co najmniej 4 elementy.

Oto efekt pracy w terminalu:
Obrazek

Jednak w tej sytuacji pojawia się inny problem w jaki sposób powinienem dokonać połączenia wartości 8 i 16 bitowej w taki sposób aby móc przekazać ja dalej do funkcji?

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


W kodzie zaznaczyłem moje próby konwersji, jednak jak widać nie udolne ponieważ dostaje tylko pierwszy fragment tablicy zamiast pełnej wartości np 65500. Czy jest na to jakiś sprytny sposób?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 01:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

No i super!
Można na przykład tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 01:15 
Offline
Użytkownik

Dołączył(a): 14 kwi 2018
Posty: 35
Pomógł: 0

Bardzo przepraszam za zamieszanie to po prostu moje gapiostwo, zgodnie z dokumentacją funkcja atoi konwertuje ciąg strnigów do zmiennej typu int, a więc przekroczenie 32 767 powoduje że przekraczam jej zakres :)
Dlatego jednak moje pytanie brzmi nieco inaczej ponieważ już nie mogę sobie przypomnieć żadnego sposobu na zamianę liczby ze znakiem na jej odpowiednik bez...
Niestety rzutowanie na uint16_t nie pomaga :/

Oto kod po poprawkach:

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


Gdybym teraz tylko zamienił typ z int na uint16_t sprawa byłaby załatwiona :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 01:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

No to zamiast atoi daj atol :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 01:18 
Offline
Użytkownik

Dołączył(a): 14 kwi 2018
Posty: 35
Pomógł: 0

Niestety to nie pomaga już próbowałem tej opcji wciąż dostaje liczbę z minusem :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 01:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

No to popraw jeszcze funkcję USART_PutInt(), bo pewnie to ona temu winna. ;)
Napisz sobie bliźniaczą funkcję np USART_PutLONG(), w której zamiast itoa będzie ltoa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2020, o 08:21 
Offline
Użytkownik

Dołączył(a): 14 kwi 2018
Posty: 35
Pomógł: 0

Wspaniale działa ! Dziękuje bardzo za pomoc !



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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO