Skocz do zawartości
RFM

Stwierdzenie końca transmisji po UART

Pomocna odpowiedź

Funkcje takie jak "Serial.print" i podobne, korzystają z bufora nadawczego. Jak stwierdzić, ze transmisja na UART faktycznie się zakończyła aby przełączyć kierunek transmisji na driverze 485? Czy "Serial.availableForWrite()" działa na wszystkich uC (AVR, ESP itd)?

Udostępnij ten post


Link to post
Share on other sites

Wystarczy odczytać odpowiednią flagę rejestru odpowiadającego za transmisję uart. Nazwa rejestru i flagi zależy od użytego mikrokontrolera, warto w tym celu zajrzeć do DS, poza tym we frameworku arduino  powinno być jakieś makro albo funkcja do tego ale nie pamiętam bo tego typu zadania obsługuję na rejestrach.

Udostępnij ten post


Link to post
Share on other sites
33 minuty temu, atMegaTona napisał:

Wystarczy odczytać odpowiednią flagę rejestru odpowiadającego za transmisję uart.

odpada bo

33 minuty temu, atMegaTona napisał:

Nazwa rejestru i flagi zależy od użytego mikrokontrolera,

 

33 minuty temu, atMegaTona napisał:

we frameworku arduino  powinno być jakieś makro albo funkcja do tego

Nie znalazłem.

Aktualizacja:

W https://github.com/esp8266/Arduino/blob/master/cores/esp8266/uart.h znalazłem funkcje inne niż dla AVR. Musze zobaczyć co robi "art_tx_free(uart_t* uart);" bo to chyba to o co omi chodzi.

To jest to

uart_tx_free(uart_t* uart)
{
    if(uart == NULL || !uart->tx_enabled)
        return 0;

    return UART_TX_FIFO_SIZE - uart_tx_fifo_available(uart->uart_nr);
}

Ale cóż, jak zwykle, sam musiałem poszukać. Na forach z pomocą różnie bywa, dlatego wiele osób, gdy rozwiąże problem, to nie piszą jak. Ja nie będę jak syn mojego ojca i dam "na tacy" rozwiązanie problemu.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Świetnie, że udało się rozwiązać problem. Dzięki za podzielenie się rozwiązaniem, na pewno przyda się komuś w przyszłości 🙂

Udostępnij ten post


Link to post
Share on other sites

Nie do końca. Funkcja zwróci 0 gdy wysłała ostatni bajt do UART. W przypadku AVR po czasie 2 bajtów (AVR ma 2 bajtowe) transmisja faktycznie będzie zakończona. W Większości uC po czasie 1 bajtu a LPC po 16 bo ma 16 bitowe FIFO (odpowiednik kultowego 16C550).

Problem przełączenia linii kierunku nadal pozostaje.

Aktualizacja:

Jest jeszcze funkcja

uart_tx_fifo_available(const int uart_nr)
{
    return (USS(uart_nr) >> USTXC) & 0xff;
}

Pozostaje albo wypróbować albo zagłebie się w dokumentacje ESP.

Aktualizacja:

Kto zauważył bałagan w funkcjach?

uart_tx_fifo_available(const int uart_nr)
{
    return (USS(uart_nr) >> USTXC) & 0xff;
}

size_t uart_tx_free(uart_t* uart)
{
    if(uart == NULL || !uart->tx_enabled)
        return 0;

    return UART_TX_FIFO_SIZE - uart_tx_fifo_available(uart->uart_nr);
}

Raz parametrem jest numer UART innym razem wskaźnik 🙂 To się nazywa "przyjazne" oprogramowanie i "ułatwienie" pracy programiście.

Ciągle nie mogę znaleźć odpowiedzi na pytanie "jak z takimi problemami ma sobie poradzić początkujący?" Gdzie te przyjazne programowanie?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...