Esistono molti modi per scrivere un protocollo seriale in base alla funzionalità che potresti desiderare e alla quantità di errore che ti serve per il controllo.
Alcune delle cose comuni che vedi nei protocolli punto a punto sono:
Fine del messaggio
I protocolli ASCII più semplici hanno solo una fine della sequenza di caratteri del messaggio, spesso \r
o \n
poiché questo è ciò che viene stampato quando viene premuto il tasto Invio. I protocolli binari potrebbero usare 0x03
o qualche altro byte comune.
Inizio del messaggio
Il problema di avere solo la fine del messaggio è che non sai quali altri byte sono già stati ricevuti quando invii il tuo messaggio. Questi byte verrebbero quindi preceduti dal messaggio e interpretati in modo errato. Ad esempio, se Arduino si è appena svegliato dalla sospensione, potrebbero esserci dei rifiuti nel buffer seriale. Per ovviare a questo hai un inizio della sequenza di messaggi. Nel tuo esempio ^
, nei protocolli binari spesso0x02
Controllo errori
Se il messaggio può essere danneggiato, abbiamo bisogno di un controllo degli errori. Questo potrebbe essere un checksum o un errore CRC o qualcos'altro.
Personaggi di fuga
È possibile che il checksum si aggiunga a un carattere di controllo, ad esempio il byte "inizio del messaggio" o "fine del messaggio", oppure che il messaggio contenga un valore uguale a un carattere di controllo. La soluzione è introdurre un carattere di fuga. Il carattere di escape viene posto prima di un carattere di controllo modificato in modo che il carattere di controllo effettivo non sia presente. Ad esempio, se un carattere iniziale è 0x02, utilizzando il carattere di escape 0x10 possiamo inviare il valore 0x02 nel messaggio come coppia di byte 0x10 0x12 (carattere di controllo XOR byte)
Numero pacchetto
Se un messaggio è danneggiato, è possibile richiedere un nuovo invio con un messaggio nack o riprovare, ma se sono stati inviati più messaggi, è possibile inviare nuovamente solo l'ultimo messaggio. Invece al pacchetto può essere assegnato un numero che passa dopo un certo numero di messaggi. Ad esempio, se questo numero è 16, il dispositivo di trasmissione può memorizzare gli ultimi 16 messaggi inviati e, se presenti, il dispositivo di ricezione può richiedere un nuovo invio utilizzando il numero di pacchetto.
Lunghezza
Spesso nei protocolli binari viene visualizzato un byte di lunghezza che indica al dispositivo ricevente quanti caratteri ci sono nel messaggio. Ciò aggiunge un altro livello di controllo degli errori come se non fosse ricevuto il numero corretto di byte, quindi si è verificato un errore.
Specifico per Arduino
Quando si tratta di un protocollo per Arduino, la prima considerazione è l'affidabilità del canale di comunicazione. Se si sta inviando tramite la maggior parte dei supporti wireless, XBee, WiFi, ecc., Sono già presenti controlli e tentativi di errore incorporati e quindi non ha senso inserirli nel protocollo. Se stai inviando tramite RS422 per un paio di chilometri, sarà necessario. Le cose che vorrei includere sono l'inizio del messaggio e la fine dei caratteri del messaggio, come hai fatto tu. La mia implementazione tipica è simile a:
>messageType,data1,data2,…,dataN\n
La delimitazione delle parti di dati con una virgola consente un'analisi semplice e il messaggio viene inviato utilizzando ASCII. I protocolli ASCII sono fantastici perché è possibile digitare messaggi nel monitor seriale.
Se vuoi un protocollo binario, forse per abbreviare le dimensioni del messaggio, dovrai implementare l'escaping se un byte di dati può essere uguale a un byte di controllo. I caratteri di controllo binario sono migliori per i sistemi in cui si desidera l'intero spettro di controlli e tentativi di errore. Il payload può comunque essere ASCII se lo si desidera.