Skocz do zawartości

Stwierdzenie końca transmisji po UART


Pomocna odpowiedź

Napisano

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)?

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.

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

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

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?

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...