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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 26 lip 2025, o 01:31


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 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