Per leggere dal master devi fare l'equivalente che stai facendo sugli slave, né più né meno.
Controlli se è arrivato qualcosa, lo scarichi, e controlli se l'indirizzo è quello del master.
Nel caso estrai i dati.
Ovviamente qui non avrai dei comandi da eseguire ma dovrai gestire dei dati in risposta, per cui il protocollo prevederà una serie di codici per istruire il master.
Facciamo un esempio.
Byte di start
Byte di indirizzo
Byte identificativo slave
Byte identificazione dato
2 o più byte per i dati
Byte di stop
Checksum
Nel byte di identificazione dello slave, ci sarà lo slave che ha spedito i dati.
Questa era una cosa a cui non pensavo prima, ma ti serve per sapere se ciò che è arrivato è arrivato dallo slave giusto. Il master potrebbe aver fatto un'interrogazione ad un altro slave.
Sono sicuro che almeno in questa prima fase iniziale, tu non farai una cosa del genere perché altrimenti ti intreccerai come pochi
Quindi mettiamo quel dato per futuri usit.
Ora ci sarà il byte identificativo del dato che lo slave ha spedito. Per capire insomma cos'è.
Se tu hai chiesto la lettura analogica sul pin 5, ti aspetti una lettura analogica indietro, giusto?
Ecco appunto, farai una tabella come quella dei comandi per sapere cos'è arrivato:
0x00 lettura digitale
0x01 lettura analogica ecc...
Mettiamo che sia una lettura analogica, sono 3 byte. Perché?
Perché hai il numero di pin, se ti serve, e la lettura stessa, che deve stare in 2 byte perché la lettura analogica restituisce un valore a 10 bit, e non puoi salvarlo in un unico byte (8 bit) per cui ti serve un tipo int, che sono 2 byte (16 bit).
Ovviamente questo se vuoi fare le cose a modino. Altrimenti, se chiedi di leggerti il pin 5, e ricevi 1000, sai che quella è la lettura del pin A5 per cui puoi anche risparmiarti un byte
Ti consiglio di usare il Serial.write per spedire i dati, e scomporre i dati nei vari byte.
Se devi spedire un tipo int, passalo in trasmissione con lowByte(dato) e highByte(dato). Per ricomporlo basta fare una moltiplicazione per 256 della parte alta del byte.
datoletto = parteBassa + (parteAlta*256)
Su questa ultima parte, leggi il reference, ci sono spiegati i comandi lowByte e highByte, nonché la sezione Serial sempre del reference, così vedi come leggere e scrivere i dati. Cerca anche sul forum la spedizione dei dati composti da più di un byte, è un argomento trattato tante volte.