@ Astroz: Grazie x la delucidazione sul watchdog !
@ Luke: Io ho già realizzato un protocollo custom che lavora su RS485. Non so nemmeno se definirlo protocollo, ma per ora funziona bene sulla mia configurazione. Ti spiego brevemente come funziona, poi se vi interessa vi mando i sorgenti:
Tutti i nodi normalmente stanno in ascolto, quando devono inviare qualcosa a qualcuno alzano il bit di direzione e inviano 10 BYTE rispettivamente:
BYTE 0: Rapresenta l'inizio del messaggio ed è fisso, nel mio caso a B11110000 (0xF0)
BYTE 1: E' l'indirizzo del mittente, nel mio caso il nodo "luci" e il B00000000 (0x00), il nodo ricevitore infrarossi e il B00000001 (0x01) ... ecc
BYTE 2: E' l'indirizzo del destinatario del messaggio, dice quale nodo deve eseguire il comando (si potrebbe eventualmente prevedere un indirizzo di broadcast per far eseguire il comando a tutti i nodi)
Byte 3: E' il comando da eseguire. Per esempio 0x02 significa "messaggio ricevuto correttamente" 0x03 significa "setta uscita", 0x04 "resetta uscita", 0x05 "inverti uscita", 0x06 "Esegui una determinata funzione", 0x07 "richiedi lo stato di un ingresso digitale" ecc ...
BYTE 4: E' il puntatore e dipende da quale comando inviamo. Per esempio se invio il comando "setta uscita" "10000000 00000001" con il puntatore che vale 0x00 io setterò l'uscita numero 0 e la numero 15, invece con il puntatore che vale 0x01 io setterò l'uscita 16 e 31, con il puntatore che vale 0x02 io setterò l'uscita 32 e 47 ... in poche parole dividendo le uscite in gruppi da 16, il puntatore mi diche a quale gruppo mi riferisco. Lo so non è chiarissimo ma magari poi faccio degli esempi.
BYTE 5 e BYTE 6: Rappresentano il valore del comando. Sempre con l'esempio del "setta uscita" impostando il puntatore a 0x00 se il BYTE 5 e il BYTE 6 valgono rispettivamente B01010101 e B01010101 io setterò le uscite n° 0, 2, 4, 6, 8, 10, 12 e 14. Praticamente faccio una maschera: dove ho un "1" setto l'uscita corrispondente, dove ho "0" non la setto.
BYTE 7 e BYTE 8: Sono 2 byte che vengono calcolati in base al valore di tutti gli altri 8 byte (magari piò avanti vi spiego come) servono per vedere se il messaggio arriva integro o se c'è stato un errore sulla trasmissione. Praticamente prima di inviare il messaggio calcolo questi 2 byte e li inserisco. Chi riceve il messaggio fa la stessa operazione e se ottiene come risultato proprio i byte 7 e 8 significa che il messaggio è integro.
BYTE 9: Rapresenta la fine del messaggio ed è fisso, nel mio caso a B11110001 (0xF1)
Praticamente tutti i nodi ricevono il messaggio, ma solo il destinatario eseguirà il comando.
Ora un piccolo esempio di comunicazione:
Il nodo ricevitore infrarossi invia:
0xF0 0x01 0x00 0x03 0x00 0x01 0x02 0x82 0xF4 0xF1 che significa
0xF0 Inizio messaggio
0x01 Sono il nodo ricevitore IR
0x00 il seguente comando è destinato al nodo "luci"
0x03 setta i relè
0x00 del gruppo "0"
0x01 (B00000001) n°15 no, n°14 no, n°13 no, n°12 no, n°11 no, n°10 no, n°9 no, n°8 si
0x02 (B00000010) n°7 no, n°6 no, n°5 no, n°4 no, n°3 no, n°2 no, n°1 si, n°8 no
0x82 Primo byte del controllo integrità
0xF4 Secondo byte del controllo integrità
0xF1 Fine del messaggio
e il nodo "luci" esegue il comando e risponde:
0xF0 0x00 0x01 0x02 0x00 0x00 0x00 0x48 0x20 0xF1 che significa
0xF0 Inizio messaggio
0x00 Sono il nodo luci
0x01 il seguente comando è destinato al nodo "ricevitore IR"
0x02 ti informo che il messaggio che mi hai appena inviato aveva i 2 byte di verifica corretti, quindi la trasmissione è avvenuta corretamente
0x00 // In questo comando non serve
0x00 // In questo comando non serve
0x00 // In questo comando non serve
0x82 Primo byte del controllo integrità
0xF4 Secondo byte del controllo integrità
0xF1 Fine del messaggio