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



Teraz jest 5 sty 2025, o 13:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
Autor Wiadomość
PostNapisane: 11 lut 2015, o 18:40 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2012
Posty: 18
Lokalizacja: Bydgoszcz
Pomógł: 1

Witam, Otóż mam pewien problem z obsługą USARTu na STM32F103VBT6. Proszę Was o podpowiedz co robię nie tak. Używam przerwań, dla pierwszych testów chciałem stworzyć program który odbierze dane nadesłane z terminala a następnie odpowie tym samym. Do tego celu w pliku USART.c zadeklarowałem 2 bufory (UART_RxBuf[32], UART_TxBuf[32]) oraz indexy początku (TxBeg, RxBeg) i końca (RxBeg, TxBeg) dla każdego z nich oraz zmienną ascii_cr która liczy znaki CR w buforze. Problem polega na tym, że dane są odbierane ale mam problem z ich wysłaniem. Do wysyłania napisałem funkcje poniżej:

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



sama funkcja działa gdy wyślę coś w stylu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Skąd wiem, że dane zostały odebrane? a no stad, że gdy w pętli głównej zrobię 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.



dostaje zawartość całego bufora:
Obrazek

Natomiast gdy podmienię tą pętle for na funkcję poniżej to w terminalu dostaje WIELKIE NIC;/

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



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



Ostatnio edytowano 11 lut 2015, o 21:58 przez simoon87, łącznie edytowano 4 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 19:18 

Pomógł: 0

Pierwsze co się rzuca w oczy to to, że nie zerujesz flag w przerwaniu :)



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2015, o 11:42 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2012
Posty: 18
Lokalizacja: Bydgoszcz
Pomógł: 1

wwojtek napisał(a):
Pierwsze co się rzuca w oczy to to, że nie zerujesz flag w przerwaniu :)


RM0008.pdf page: 662
In single buffer mode, clearing the RXNE bit is performed by a software read to the USART_DR register.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2015, o 12:13 

Pomógł: 0

Aaa tu mnie masz, faktycznie nie trzeba kasować - mea culpa :D
To była dobra wiadomość... zła jest taka, że nie mam innych pomysłów :roll:

Tzn. coś mi nie pasuje w buforze kołowym. Chyba za bardzo chciałeś uprościć z tym przekazywaniem bufora bezpośrednio do puts - ale mogę się mylić bo tak skoro świt to ciężko się myśli ;)

Po resecie procka bufory Rx i Tx są wyzerowane, więc USART_Puts( USART1, UART_RxBuf ); od razu wraca.
Przychodzi jakiś znak - dajmy na to 'x'. Odpala się przerwanie od odbioru i dzieje się coś takiego (pominąłem to co nie ważne):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
czyli bufor wygląda mniej więcej tak: RxBuf = {0, 'x', 0, 0, 0, 0... };

Przerwanie się kończy, wracamy do pętli głównej - odpala się USART_Puts( USART1, UART_RxBuf ); i... i od razu wraca bo UART_RxBuf wskazuje na początek bufora - czyli na 0; odebrany znak jest na kolejnej pozycji.

To by tłumaczyło czemu nie działa, chyba że po drodze coś zgubiłem ;)


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2015, o 19:07 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 kwi 2012
Posty: 18
Lokalizacja: Bydgoszcz
Pomógł: 1

Dzięki wielkie ;) , 3dni patrzyłem na ten kod i nie wiedziałem gdzie mam zonk... Teraz muszę tylko wykombinować jak to poprawić, tak żeby nie przeszkadzało później. Docelowo aplikacja ma współpracować z GPSem ale chwiałbym też mieć możliwość wysłania czegoś na terminal bez wielkich zmian.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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