arduino :-D

Hejka. Fragment kodu:

digitalWrite(pin, HIGH); Serial.print(dane); digitalWrite(pin, LOW);

Czyli ustawiam stan wysoki na pinie, wysyłam jakieś dane na sprzętowy port szeregowy, ustawiam stan niski na pinie. Chcę by stan wysoki na pinie był obecny przez czas trwania transmisji przez port szeregowy, a nie, jak się domyślam, tylko podczas pisania do bufora (stan wysoki jest tylko przez chwilę, podczas gdy dane wysyłane są przez uart dalej). Jak to zrobić programowo?

Reply to
Michał Czarkowski
Loading thread data ...

Arduino ma pod spodem zwyczajny toolchain AVR od Atmela. Wciąż możesz używać nazw rejestrów mikrokontrolerów z tej rodziny. Napisz więc sobie kilka podstawowych funkcji, odwołujących się bezpośrednio do rejestrów.

Najpierw coś w rodzjaju:

void uart_putc (char data) { BUFOR_NADAWCZY = data; while (REJESTR_STANU_UART & MASKA_PINU_STANU_NADAJNIKA); }

a potem:

void uart_puts (char *str) { while (*str) { uart_putc(*str); str++; } }

Oczywiście nazwy rejestrów musisz podmienić na te odpowiadające konkretnemu UART-owi w mikrokontrolerze użytym w danym Arduino.

Potem po prostu w programie wywołujesz uart_puts.

Reply to
Atlantis

W dniu 2018-08-25 o 15:43, Michał Czarkowski pisze:

Siemanko A kolega to cokolwiek przeczytał w dokumentacji?

formatting link

Reply to
Piotr Dmochowski

W dniu Sat, 25 Aug 2018 19:31:54 +0200, użytkownik Piotr Dmochowski napisał:

Cześć. Cokolwiek przeczytałem, owszem. :-D Wygląda na to, że nie wszystko… :-D Działa. Do tej pory do niczego nie było mi to potrzebne. Dziękuję za podpowiedź. W ostateczności miałem „załatwić” to sprzętowo, ale podejrzewałem, że to musi się dać łatwo zrobić programowo. Dobrze, że tu teraz zerknąłęm w przerwie w czytaniu o usarcie w pdfie od microchipa :-D - temat zacny, ale użycie Serial.flush jest łatwiejsze. Pozdrawiam.

Reply to
Michał Czarkowski

W dniu Sat, 25 Aug 2018 16:36:30 +0200, użytkownik Atlantis napisał:

Dzięki za podpowiedź. Właśnie zrobiłem sobie przerwę w czytaniu pdf od microchipa i kolega w poscie poniżej naprowadził mnie na Serial.flush(). To rozwiązuje mój mały problem.

Reply to
Michał Czarkowski

Flush zawsze służył do asynchronicznego opróżnienia buforów portu szeregowych w przygotowaniu na nową transmisję.

Dziwna to dla mnie decyzja zmiany tej funkcjonalności i wykorzystanie istniejącej funkcji do drastycznie innego celu... Nie lepiej było dodać nową funkcję biblioteczną o nazwie np. waitTXbuffempty(int timeoutSeconds) z argumentem w postaci timeoutu? Co, jeśli transmisja jest z handshake CTS/RTS i jest zablokowana sygnałem CTS i program zwiśnie na zawsze??

Reply to
Pszemol

Pszemol snipped-for-privacy@PolBox.com napisał(a):

Jak najbardziej racja. To typowy przykład wynajdywania przez Arduino koła na nowo. A potem ludzie się dziwią, że miało być prościej a jest trudniej :)

Reply to
Grzegorz Niemirowski

Wejściowych.

Domyślam się, że zachowanie jest podobne do fflush(3).

formatting link
For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function.

For input streams associated with seekable files (e.g., disk files, but not pipes or terminals), fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application.

Reply to
Queequeg

A jednak miałeś rację, wyjściowych też :)

formatting link
#v+ tcdrain() waits until all output written to the object referred to by fd has been transmitted.

tcflush() discards data written to the object referred to by fd but not transmitted, or data received but not read, depending on the value of queue_selector: #v-

Czyli powinni nazwać drain, a nie flush...

Reply to
Queequeg

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.