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



Teraz jest 19 kwi 2024, o 04:20


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
 Tytuł: UART-wskazniki
PostNapisane: 16 sty 2018, o 00:31 
Offline
Użytkownik

Dołączył(a): 13 lis 2016
Posty: 35
Pomógł: 0

Witam wszystkich,

mam pewien problem. Stworzyłem bibliotekę w oparciu o GB i transmisja działa poprawnie. Pojawił się pewien problem podczas odczytywania komendy.

Chciałem osiągnąć taki efekt: Przy komendzie zapis(przykładowo AT+DIR=UP), chcę zapamiętać ostatni parametr (w tym przypadku UP), abym mógł go wywołać podczas odczytu (AT+DIR?).

Zrealizowałem to w ten sposób, że zdefiniowałem sobie globalny wskaznik typu char (char *_last_dir). Gdy parametr przekazany do funkcji jest mówiąc w skrócie poprawny chcę ustawić wskaznik _last_dir na adres w pamięci FLASH tożsamy z tym parametrem. Następnie, gdy przyjdzie odczytać zapamiętany wcześniej kierunek (_last_dir) wywołuję funkcję uart_puts(_last_dir) w celu uzyskania w terminalu tej informacji(UP). Tutaj pojawia się problem, ponieważ takiej informacji nie uzyskuję. Dla testów przesyłam do terminala TEST1 i TEST2 i działa to zgodnie z oczekiwaniami. Pytanie moje brzmi, w czym zatem robię błąd? Spędziłem nad tym trochę czasu i postanowiłem poprosić o radę. Poniżej kod.

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: 17 sty 2018, o 06:47 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Przedstawiłeś zbyt mało kodu, więc mogę się tylko domyślać, jakiego typu są elementy struktury (a raczej tablicy struktur) dir_id. Domyślam się więc, że dir_id[i].dir_id to wskaźnik na ciąg znaków w pamięci FLASH, tak samo jak _last_dir (cytuję: "chcę ustawić wskaznik _last_dir na adres w pamięci FLASH tożsamy z tym parametrem"). W takim przypadku wystarczy przypisać wartość dir_id[i].dir_id do zmiennej _last_dir:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ponieważ to co zrobiłeś:
BarGai napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to odczyt z pamięci FLASH dwóch pierwszych znaków ciągu, na który wskazuje dir_id[i].dir_id i utworzenie z nich (błędnego) wskaźnika.

Druga sprawa - nie mam GB, więc nie czytałem i nie znam kodu "biblioteki" od UART, ale jeśli _last_dir jest wskaźnikiem na ciąg znaków we FLASH, najprawdopodobniej ta linia kodu nie zadziała:
BarGai napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Do wysyłania przez UART ciągu znaków zapisanego w pamięci FLASH powinna być dostępna inna funkcja (zwykle z przyrostkiem "_P", czyli np. uart_puts_P() ), która odpowiednio interpretuje przekazywany do niej wskaźnik.

Na razie tyle zauważyłem (co jest związane z przedstawionym przez Ciebie problemem), ale nie wykluczone, że masz tam jeszcze inne błędy. Trudno to wywnioskować na podstawie tak skromnych fragmentów kodu. Przydałyby się jeszcze przynajmniej deklaracje i definicje zmiennych, którymi operujesz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sty 2018, o 19:40 
Offline
Użytkownik

Dołączył(a): 13 lis 2016
Posty: 35
Pomógł: 0

Dziękuję za odpowiedz! Przeanalizowałem to co napisałeś i swoje podejście. Faktycznie chcąc ustawić wskaznik _last_dir na wartość w pamięci Flash wystarczy zrobić to w taki sposób jaki napisałeś. Powodem błędnego podejścia była zła interpretacja funkcji odczytu z pamięci Flash. Teraz wiem, że tworząc w taki sposób wskaznik w jaki stworzyłem przypisuje do niego wartości dwóch pierwszych elementów z tablicy, co tworzy nam oczywiście błędny wskaznik.

Poczytam kiedyś w wolnej chwili o funkcji realizującej wysyłanie poprzez UART stringów z pamięci Flash przy pomocy funckji uart_puts_P(). Na ten moment poradziłem sobie poprzez powołanie zmiennej statycznej tablicowej, do której po spełnieniu warunków będzie kopiowany string z parametru funkcji.

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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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