Trasmissione dati in my serial con schede a delay dfferenti

Salve ragazzi ho un piccolo problemino con i dati in seriale ausiliaria

Le schede comunicano ed i dati arrivano, solamente che la scheda che trasmette lavora piu velocemete della scheda che riceve e quindi la variazione dei dati mi arriva con troppo ritardo perche il dato resta in coda agli altri. Ho provato a richiedere il dato con la prima scheda e fare in modo che la seconda trasmetta solo su richiesta ma non funziona. Qualcuno mi puo spiegare come si può rimediare? La comunicazione funziona e le schede sono 2 mega Vi ringrazio molto

capitankevin:
Ho provato a richiedere il dato con la prima scheda e fare in modo che la seconda trasmetta solo su richiesta ma non funziona.

Posta il codice e vediamo. :smiley:

I codici sono abbastanza lunghi e la sintassi non è proprio corretta :blush:
Poi li metterò a posto
Scusatemi ma sto ancora costruendo lo sketch definitivo
I dati arrivano (ricevo il dato “centigradi8”) con l’altra scheda, poi quando la temperatura comincia a scendere continuo a ricevere la vecchia temperatura come se ci fossero dei dati in coda

Temperature_stanze_con_lcd_soglie_e_time.ino (8.64 KB)

Gestione_circuito_idraulico_di_alta_con_RTC_definitivo.ino (6.23 KB)

Oggi ho fatto delle prove con un codice solo per trasmissione e ricezione ed ho trovato che se le schede vanno alla stessa vlocita il sistema sembra funzionare me se hanno delay differenti i dati restano nel buffer e non c’è verso di cancellarli.
Dopo un po’ la slave si blocca e non trasmette piu’ dati.
Bisogna spegnere e riaccendere la seriale ed allora riparte tutto.
Ho provato di tutto.

prova_dialogo_bus_sketch_di_esempio.ino (473 Bytes)

prova_dialogo_bus_sketch_di_esempio_master.ino (393 Bytes)

capitankevin: Oggi ho fatto delle prove con un codice solo per trasmissione e ricezione ed ho trovato che se le schede vanno alla stessa vlocita il sistema sembra funzionare me se hanno delay differenti i dati restano nel buffer e non c'è verso di cancellarli. Dopo un po' la slave si blocca e non trasmette piu' dati. Bisogna spegnere e riaccendere la seriale ed allora riparte tutto. Ho provato di tutto.

Ciao!

Ho provato a guardare il tuo codice .. però quello "slave" non me lo compila ... mancano i "." in mySerial.available() e poi la classe Serial è con la S maiuscola (riga 28). A parte questo non ho capito perchè fai un ciclo "while" ... a cosa ti serve? Anche perchè così facendo - se ci fosse un dato - lo prendi e lo imposti nella variabile A che poi "non usi" ... mentre sulla seriale "classica" mandi il dato letto in origine (prima del while) ...

Se riesco poi nel weekend faccio qualche prova perchè anch'io volevo utilizzare la libreria SoftwareSerial per comunicare tra più schede arduino (UNO) collegate tra loro.

Scusami ma il codice l'ho compilato al volo prima di andare a scuola :P

ll while in teoria dovrebbe svuotare la seriale cioè Con l' "if" Arduino legge il primo dato che arriva nella seriale e che in teoria dovrebbe esser l'unico se le schede lavorano alla stessa velocità. Con il while prende tutti gli altri dati che ci sono nel buffer li racchiude in una variabile "cestino" e poi li butta E' un codice che ho trovato in forum e che dovrebbe sostituire il "serial flush" che non funziona più Ho provato anche con il "serial flush" mettendolo al posto del ciclo "while" ma niente da fare i dati restano li e dopo un po' la seriale si riempie e si blocca tutto

Chi prepara i dati da inviare potrebbe inviare solo una notifica del tipo; ci sono nuovi dati. Chi legge sapendo che ci sono nuovi dati, richiede l'invio e li attende in loop, ricevuti si mette a fare altro tra cui verificare se c'è notifica di nuovi dati.

Ciao.

Lo so ma ho due problemini su questo aspetto: Il primo è che non so come si imposta una notifica :~ Il secondo è che il dato inviato all'altra scheda finisce in un display e quindi andrebbe aggiornato con il delay della scheda che lo riceve che poi lo invia via seriale principale all'interfaccia utente che è gestita in processing.

La notifica è legata al protocollo e sei tu che crei il protocollo di comunicazione.
Esempio stabilisci che il carattere # è una notifica, si ma di che tipo?

Chi riceve # vuole sapere di che tipo è la notifica e se c’è ne sono più di una messe in coda e quindi chiede
?#, cioè invia al trasmittente ?# e si mette in ascolto per ricevere la risposta.

Se la risposta è previsto sia composta da più byte si leggono n byte previsti, se invece la risposta può essere più o meno lunga si deve spedire la lunghezza e poi i singoli byte. Con lunghezza di dati variabile il codice da scrivere aumenta e si complica un poco, ma è fattibile.

Master out → ‘#’ : spedisce una notifica generica e si mette a fare altro, oltre ad ascoltare su seriale.
Slave in -< ‘#’ : Ricevuto un notifica, in conseguenza
Slave out → ‘?#’ : Chiede informazioni sulla notifica, in conseguenza si mette in ascolto
Master -< ‘?#’ : Lo slave chiede informazioni sul tipo di notifica
Master out → ‘u’ : invia informazioni sul tipo di notifica
Slave -< ‘u’ : Dal protocollo ‘u’ significa che ci sono nuovi dati elaborati
Slave → ‘?u’ : Richiede i dati
Master -< ‘?u’ : Dal protocollo slave richiede i dati
Master → '@, byte, byte, …ecc
ecc…

Non quali sono gli attori e cosa devono fare, quindi quella suggerita potrebbe essere la strategia sbagliata,
comunque ti è sempre utile per creare un protocollo, spero.

Ciao.

Io avevio fatto una cosa di questo tipo ed in teoria avrebbe dovuto funzionare: Il master inviava un dato richiesta (un numero byte da 1 a 3) Lo slave riceveva il numero, ed a seconda del numero che riceveva inviava il dato corretto(che essendo dati di temperatura sono numeri che vanno da 0 a 60) Gia' inviando la richiesta non funziona, nel senso che se invio come dato richiesta 1 e poi subito dopo invio 3 nella seriale mi ritrovo 1 e sempre 1 e se tolgo i cavi della seriale dall'ingresso della scheda continuo a ricevere 1 anche con i fili scollegati :astonished: Per trovarmi il 3 devo chiudere e riaprire la seriale della IDE del computer allora ricevo 3. Infine se invio la richiesta dopo 3 - 4 minuti la scheda che invia si blocca.