-
1. Data: 2018-08-25 15:43:51
Temat: arduino :-D
Od: Michał Czarkowski <m...@p...onet.pl>
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?
-
2. Data: 2018-08-25 16:36:30
Temat: Re: arduino :-D
Od: Atlantis <m...@w...pl>
On 25.08.2018 15:43, Michał Czarkowski wrote:
> 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?
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.
-
3. Data: 2018-08-25 19:31:54
Temat: Re: arduino :-D
Od: Piotr Dmochowski <i...@p...onet.pl>
W dniu 2018-08-25 o 15:43, Michał Czarkowski pisze:
> 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?
>
Siemanko
A kolega to cokolwiek przeczytał w dokumentacji?
https://www.arduino.cc/en/Serial/Flush
https://forum.arduino.cc/index.php?topic=487082.0
--
Pozdrawiam
Piotrek
-
4. Data: 2018-08-25 20:34:40
Temat: Re: arduino :-D
Od: Michał Czarkowski <m...@p...onet.pl>
W dniu Sat, 25 Aug 2018 19:31:54 +0200, użytkownik Piotr Dmochowski
napisał:
> W dniu 2018-08-25 o 15:43, Michał Czarkowski pisze:
>> 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?
>>
> Siemanko A kolega to cokolwiek przeczytał w dokumentacji?
> https://www.arduino.cc/en/Serial/Flush
> https://forum.arduino.cc/index.php?topic=487082.0
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.
-
5. Data: 2018-08-25 20:40:41
Temat: Re: arduino :-D
Od: Michał Czarkowski <m...@p...onet.pl>
W dniu Sat, 25 Aug 2018 16:36:30 +0200, użytkownik Atlantis napisał:
>
> 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.
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.
-
6. Data: 2018-08-26 18:51:33
Temat: Re: arduino :-D
Od: Pszemol <P...@P...com>
Piotr Dmochowski <i...@p...onet.pl> wrote:
> W dniu 2018-08-25 o 15:43, Michał Czarkowski pisze:
>> 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?
>>
> Siemanko
> A kolega to cokolwiek przeczytał w dokumentacji?
> https://www.arduino.cc/en/Serial/Flush
> https://forum.arduino.cc/index.php?topic=487082.0
>
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??
-
7. Data: 2018-08-26 22:47:55
Temat: Re: arduino :-D
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
Pszemol <P...@P...com> napisał(a):
> 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??
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 :)
--
Grzegorz Niemirowski
https://www.grzegorz.net/
-
8. Data: 2018-08-29 00:06:03
Temat: Re: arduino :-D
Od: q...@t...no1 (Queequeg)
Pszemol <P...@p...com> wrote:
> Flush zawsze służył do asynchronicznego opróżnienia buforów portu
> szeregowych w przygotowaniu na nową transmisję.
Wejściowych.
Domyślam się, że zachowanie jest podobne do fflush(3).
http://man7.org/linux/man-pages/man3/fflush.3.html
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.
--
https://www.youtube.com/watch?v=9lSzL1DqQn0
-
9. Data: 2018-08-29 00:07:48
Temat: Re: arduino :-D
Od: q...@t...no1 (Queequeg)
Queequeg <q...@t...no1> wrote:
>> Flush zawsze służył do asynchronicznego opróżnienia buforów portu
>> szeregowych w przygotowaniu na nową transmisję.
>
> Wejściowych.
A jednak miałeś rację, wyjściowych też :)
https://linux.die.net/man/3/tcdrain
#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...
--
https://www.youtube.com/watch?v=9lSzL1DqQn0