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



Teraz jest 27 kwi 2024, o 02:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 16 paź 2017, o 12:17 
Offline
Użytkownik

Dołączył(a): 25 wrz 2014
Posty: 137
Lokalizacja: Konin/Poznań
Pomógł: 0

Witam,

piszę z pytaniem odnośnie parametrów w komendach AT. Czy ktoś mógłby nakierować mnie jak zrobić programowo odbieranie parametru większego niż waga char ? Np. chciałbym przekazać do urządzenia AT+CMD=2562, a char ma tylko 8 bitów no i nie zapisze do zmiennej wsk więcej niż 255. Chciałem wykorzystać te funkcje zawarte w GB:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy należałoby zamiast zmiennej wsk zadeklarować jakąś tablicę char, która byłaby buforem ? Nie wiem jak to rozwiązać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2017, o 12:50 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

W funkcji parse_uart_data() masz np. 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.


czyli, tłumacząc z "polskiego na nasze ;-)" jeśli znalazłeś komendę w tablicy polecenia_at[i].polecenia_at, to wywołaj funkcję _at_srv, na którą wskaźnik masz w: polecenia_at[i].at_service. Prototyp tej funkcji wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

, gdzie drugi parametr jest wskaźnikiem typu char* - w tym wypadku wywołujesz tą funkcję, ustawiając wskaźnik na to, co zostało Ci z parsowania komendy - czyli konkretnie parametr danej komendy ( reszta w tym kodzie powyżej), a to przecież jest właśnie reszta tego stringa, czyli w Twoim przypadku było by to właśnie 2562, ale jako string właśnie, czyli reasumując niczego więcej nie potrzebujesz robić. Jeśli chcesz traktować tego stringa jako liczbę, to kto Ci zabroni? Zamień go na liczbę korzystając a atoi() i już :-) - po prostu w twojej funkcji at_srv_komenda_xxx(uint8_t inout, char* data) zrób 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.
Warto zrobić dodatkowe zabezpieczenia, aby nie konwertować jakichś bezsensownych stringów na liczby, no ale to chyba oczywiste.

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2017, o 12:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lis 2012
Posty: 298
Pomógł: 13

Ale komendy AT wysyłasz jako stringa - każdy znak to char. Każdy znak komendy AT+CMD=2562 jest charem. Nie przesyłasz naraz liczby 2562, tylko zamieniasz ją na cztery znaki char '2', '5', '6', '2' i dopiero po odbiorze przerabiasz to na liczbę.
Chyba, że coś nie tak zrozumiałem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2017, o 15:26 
Offline
Użytkownik

Dołączył(a): 25 wrz 2014
Posty: 137
Lokalizacja: Konin/Poznań
Pomógł: 0

@QuadMan no właśnie.... skoro wszystko ładnie powinno samo wychodzić tylko ze zmianą ilości bitów zmiennej w wywoływanej funkcji dla komendy AT to byłoby fajnie, z tym że zmiana uint8_t na uint16_t nic nie daje. Wydaje mi się, że dlatego bo char sam z siebie jest 8 bitowy i przez to przyjmuje wartość max 255.

Zaznaczę, że próbowałem konwertować string zarówno funkcją atol jak i strtol i nic. Atoi też nic nie da bo 8 bitowy int.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2017, o 19:04 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam ponownie.

Kol. Vroobee, chyba nie bardzo się zrozumieliśmy. Przyjrzyj się temu fragmentowi, który umieściłem na początku poprzedniego posta. Masz tablicę:
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, jeśli nastąpi znalezienie komendy "AT+CMD", to następuje wywołanie funkcji at_cmd_service(coś, tam, reszta) - gdzie reszta to to co zostało z parsowania Twojego stringa "AT+CMD=2562". Funkcja ta musi mieć następującą postać:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


I tyle. Kurde, już prościej nie umiem....

Pozdrawiam, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 paź 2017, o 19:08 
Offline
Moderator
Avatar użytkownika

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

Vroobee napisał(a):
@QuadMan no właśnie.... skoro wszystko ładnie powinno samo wychodzić tylko ze zmianą ilości bitów zmiennej w wywoływanej funkcji dla komendy AT to byłoby fajnie, z tym że zmiana uint8_t na uint16_t nic nie daje. Wydaje mi się, że dlatego bo char sam z siebie jest 8 bitowy i przez to przyjmuje wartość max 255.

Zaznaczę, że próbowałem konwertować string zarówno funkcją atol jak i strtol i nic. Atoi też nic nie da bo 8 bitowy int.


kolega sobie może obejrzy jakiś dowolny z moich ostatnich poradników gdzie poruszam komunikację UART czy to z Delphi czy B4A i zobaczy o co chodzi - bo niestety ale z tego co piszesz i jakie pytania zadajesz - to na razie wygląda, że KOMPLETNIE nie rozumiesz co to są tablice w języku C a szczególnie C-Stringi

a to jest mega proste i nie ma nic wspólnego z jakimś twoim przekształcaniem uint8 na uint16 ... albo to co piszesz o jakimś char co to jest 8 bitowy ... eeeeh

albo na początek to obejrzyj sobie koniecznie może ten poradnik co ?



_________________
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: 19 paź 2017, o 09:35 
Offline
Użytkownik

Dołączył(a): 25 wrz 2014
Posty: 137
Lokalizacja: Konin/Poznań
Pomógł: 0

Okej, potwierdzam to był mój błąd i z racji tego, że długo męczyłem się nad rozgryzieniem o co chodzi napisałem takie głupoty bo już kombinowałem. Okazało się, że błąd wynikał z typu zmiennej, do której wpisywałem pobraną ze stringa wartość. Zamiast:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Koniec. Taki chochlik, który wkurzał mnie przez dłuższą chwilę. Warto było zerknąć na początek kodu :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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