Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Flag per buffer TX vuoto

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

0
voti

[1] Flag per buffer TX vuoto

Messaggioda Foto UtenteFrenzi » 16 feb 2021, 10:43

Ciao a tutti, mi servirebbe un aiuto: ho "demultiplexato" l'uscita seriale di arduino su 4 uscite seriali differenti mediante 4 porte OR (con un 4071), con un ingresso in comune a tutte con il seriale da trasmettere, e l'altro ingresso di ciascun OR comandato da un uscita digitale in modo da dare o meno il consenso alla trasmissione su quella particolare uscita (basso=consenso).
Il problema nasce dalla gestione della logica di attivazione degli OR, perché la scrittura su seriale avviene in modo asincrono, quindi se io dopo aver dato il comando di scrittura abilito/disabilito le uscite senza aspettare che la trasmissione sia avvenuta (con flush()) le uscite vengono abilitate/disabilitate molto in anticipo rispetto alla trasmissione dati.
Purtroppo però il comando flush() blocca l'esecuzione di tutto il resto del programma finche la trasmissione non è terminata, e questo nel mio caso rappresenta un grosso problema (devo mantenere un refresh degli ingressi molto elevato anche "durante" la trasmissione su seriale) .
Stavo quindi cercando un modo per "rendere bloccante flush() solamente per la funzione di attivazione degli OR"; meglio, mi domandavo se esistesse una flag di "buffer TX vuoto" da controllare ad ogni ciclo, senza bloccare completamente l'esecuzione del programma. Su google ho trovato qualcosa a riguardo, ma le risposte non mi sono per nulla chiare. QUalcuno saprebbe aiutarmi? Grazie
Avatar utente
Foto UtenteFrenzi
201 6
Frequentatore
Frequentatore
 
Messaggi: 136
Iscritto il: 4 giu 2015, 11:52

0
voti

[2] Re: Flag per buffer TX vuoto

Messaggioda Foto UtenteFrenzi » 16 feb 2021, 11:19

EDIT: non avevo pensato di guardare direttamente il sorgente del comando flush: qui https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial.cpp alla riga 213 il ciclo while appartenente al flush() continua finché il bit UDRIE0 del registro *_ucsrb è presente oppure finché il bit TXC0 del registro *_ucsra è "pulito"; facendo qualche ricerca sul bit TXC0 mi pare di aver capito che sia proprio quello che sto cercando, ovvero una flag di trasmissione completata. Non mi resta che provare .. qualcuno ha qualche consiglio in merito?
Avatar utente
Foto UtenteFrenzi
201 6
Frequentatore
Frequentatore
 
Messaggi: 136
Iscritto il: 4 giu 2015, 11:52


Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite