Curiosità comunicazione seriale tra due atmega

Ciao a tutti,

Vi scrivo per colmare un vuoto dato sicuramente dalla mia ignoranza sull’argomento. Quindi mi scuso in anticipo per la banalità del problema.

In vari programmini ho sfruttato la comunicazione seriale come feedback a video per analizzare l’avanzamento dei vari cicli, ma ora ho voluto sperimentare unendo tra loro txrx di un primo Arduino con rxtx di una seconda scheda (ovviamente unendo tx con rx e viceversa).

Il primo Arduino stampa ogni 50ms il carattere ‘a’
Il secondo, quando vi è comunicazione, legge il carattere in arrivo e lo stampa su una seconda seriale.

Tra TX del primo Arduino e l’RX del secondo ho posto un interruttore.

Benissimo, perché se apro l’interruttore il secondo Arduino continua a ricevere e stampare il carattere ‘a’ per svariati secondi? C’è una specie di accumulo/memoria sui dati in ricezione e continua ad eseguire le istruzioni fino a che non li ha processati tutti?

SI, la seriale su arduino è gestita ad interrupt ed utilizza un buffer circolare sia in trasmissione che in ricezione.

Guglielmo

Grazie per la precisazione.

Quindi non c’è modo di interromperla ‘istantaneamente’ mediante un interruttore esterno?

Questa cosa però mi accende un secondo dubbio: la trasmissione è più performante della ricezione? O il ritardo si ha a causa dell’elaborazione del dato?

Hai due serbatoi, uno per la trasmissione ed uno per la ricezione ... quando tu scrivi li riempi alla massima velocità della MCU (che ti ricordo viaggia a 16 MHz) quindi ... ci mette meno di un battito di ciglia a riemprli; lo svuotamento invece avviene alla velocità di trasmissione che hai scelto ... che è sicuramente molto più lenta della velocità con cui hai riempito il serbatoio di caratteri.

A questo devi aggiungere che tu da una parte devi ricevere e dall'altra stai trasmettendo al monitor seriale ... e chiaro che i dati si accumulano nel serbatioio ed impiegano un po' di tempo per essere svuotati.

Guglielmo

Boh

Servirebbe vedere i due programmi

A 9600 bps il carattere 'a' richiede un millisecondo
Contando eventuali fine riga fanno 3 al massimo

Alla cadenza di uno ogni 50mS di tempo ne dovrebbe avanzare un fracco per fare anche le capriole, altro che intasare i buffer

Secondo me c'è altro...

Dipende dal programma

Al limite comunque puoi mettere in pausa il programma invece che tagliare la linea

Se lui scrive a raffica riempie il buffer in qualche microsecondo ... il buffer va svuotato, SE va a 9600, un po' meno di 1000 caratteri al secondo quindi, nel momento che apre l'interruttore, comunque almeno un altro bel po' di caratteri vengono stampati sul monitor seriale (il buffer varia in funzione della memoria SRAM libera e può arrivare a 64 caratteri) ...

Guglielmo

Non scrive a raffica

Dice un carattere ogni 50mS

E comunque 64 byte di buffer sono 64mS di trasmissione. Manco li vedi...

Magari il rallentamento è lato monitor seriale
Serve vedere il codice

Domani faccio un check e vi condivido i due programmi. Intanto vi ringrazio per le preziose risposte

Ah ... vero .. non lo avevo considerato ... :roll_eyes: ... a 50 mS non ci dovrebbe essere problema ...

Guglielmo

Confermo di aver probabilmente fatto qualche errore io... poiché ora chi riceve e chi trasmette viaggia a 115200 e la problematica del ritardo che avevo riscontrato si è risolta da sé.

Grazie per le dritte

Interessante
la prossima volta, prima di risponderti aspetterò che tu scopra da solo i tuoi errori, così io risparmio fatica e tu il tempo di leggermi

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.