Pagina 1 di 1

Flag per buffer TX vuoto

MessaggioInviato: 16 feb 2021, 10:43
da Frenzi
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

Re: Flag per buffer TX vuoto

MessaggioInviato: 16 feb 2021, 11:19
da Frenzi
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?