Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

HAL_UART_Transmit_IT nie działa

aspdev 31 Sty 2018 01:03 672 6
  • #1 31 Sty 2018 01:03
    aspdev
    Poziom 3  

    Witam

    Od dwóch godzin próbuję znaleźć przyczynę tego, dlaczego poniższy kod nie działa i dlaczego program nie transmituje danych do konsoli . Czy coś w poniższej funkcji jest nie tak jak trzeba? Może UART jest za wolny i nie nadąża wysyłać znak po znaku do PC? Bardzo proszę o sugestie. Pracuję na STM32F446RE.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 6
  • #3 31 Sty 2018 20:21
    piotrva
    Moderator na urlopie...

    Do funkcji HAL_UART_Transmit_IT przekazujesz wskaźnik na dane do wysłania, które nie są kopiowane nigdzie. Po wyjściu z pokazanej przez Ciebie funkcji dane te mogą zostać zniszczone (są to zmienne lokalne). I zanim uart nada ten znak to już może czytać jakieś śmieci z pamięci RAM.

    Niestety funkcje hala do nadawania z przerwaniami są pod tym względem bublowate.

    0
  • #4 13 Lut 2018 10:40
    aspdev
    Poziom 3  

    UART jest skonfigurowany poprawnie w CubeMx. Sprawdzałem. Jest nadawanie i odbiór. Z kolei jednoelementowa tablica, która jest następnie przekazywana do funkcji HAL_UART_Transmit_IT jest zdefiniowana globalnie, więc dane nie powinny ginąć. Dalej nadawanie wygląda tak, że zdefiniowana jest funkcja obsługująca przerwanie od nadawanie przez UART. W obsłudze przerwania sprawdzamy czy w buforze jest coś jeszcze do wysłania. Jeśli tak (tx_counter > 0) pobieramy kolejny raz i wysyłamy aż do momentu, gdy wszystkie znaki w buforze zostaną wysłane. Niestety takie rozwiązanie nie działa a konsola wyrzuca śmieci, choć wydaje mi się, że logika programu jest poprawna. Może ktoś ma jakiś pomysł? Poniżej zamieszczam kod z Callbacka: [code]

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #5 13 Lut 2018 11:06
    BlueDraco
    Specjalista - Mikrokontrolery

    Cały sens nadawania w przerwaniach polega na tym, że każesz nadawać ciąg znaków i zapominasz, a procedura obsługi przerwania nadaje "w tle". Nadawanie po jednym znaku tak, jak to zrobiłeś, nie ma żadnego sensu. Nie używam HAL, ale zgaduję (być może błędnie), że wywołanie HAL_UART_Transmit_IT kończy się natychmiast, i chyba przed kolejnym wywołaniem wypadałoby sprawdzić, czy nadawanie zostało zakończone.

    0
  • #6 13 Lut 2018 11:18
    aspdev
    Poziom 3  

    Z tego co wiem, funkcja obsługująca przerwnie void HAL_UART_TxCpltCallback jest wywoływana, gdy rejestr tx Usarta jest pusty, więc gdy nadawanie zostało zakończone. Wówczas nadajemy kolejny znak. Co tutaj jeszcze sprawdzać?

    0
  • #7 13 Lut 2018 14:24
    BlueDraco
    Specjalista - Mikrokontrolery

    Ta funkcja jest wywoływana, gdy zostanie zakończona transmisja całego bufora, a Ty przerzucasz do bufora i każesz transmitować po jednym znaku, zamiast raz wywołać Transmit dla całego napisu.

    0