Consigli per un semplice protocollo di comunicazione (iPod e Arduino)

3

Ho collegato l'iPod con Arduino usando la connessione seriale (UART). Arduino invia il numero 0-1023 (quindi è di due byte) poiché è il valore del sensore di luce dei campioni.

Sto chiedendo consigli su un protocollo di comunicazione semplice e affidabile.

  1. Ho bisogno di costanti magiche per avviare / interrompere la comunicazione.
  2. Forse ho bisogno di dati inviati di piccoli pezzi.

Ora ho:

while (1)
{
   data = getData() ; 
   // two bytes of 0-1024
   Serial.write((data) & 0xFF)) ; 
   Serial.write((data) & 0x300)) ; 
}

Qualche suggerimento su come implementare un protocollo semplice e affidabile?

Immagine del mio dispositivo: link

Grazie

    
posta kesrut 19.04.2014 - 10:48
fonte

2 risposte

3

Ci sono diversi motivi per avere un protocollo, anche molto semplice.

  • Riduci il rischio di errori, forse quando il dispositivo è connesso, avviato, arrestato
  • Consenti espansioni future: forse il dispositivo invia due tipi di dati in futuro
  • Assicurati di leggere dal dispositivo giusto e non qualcosa di diverso.
  • Aiuta il debug se riesci a vedere uno stream che puoi riconoscere.

Ci sono alcuni vantaggi nell'usare i caratteri ASCII, se vuoi eseguire il debug. Lo farò in binario e includerò un byte di lunghezza.

Suggerirei un semplice protocollo di 6 byte. Di ':

Serial.write(0xc5); // start
Serial.write(0x06); // total length of packet
Serial.write(0x01); // 1=temperature data
Serial.write(data & 0xff); // low byte of data
Serial.write((data >> 8) & 0xff)); // high byte of data
Serial.write(0x5c); // end

Semplice, facile da codificare, espandibile. Questa sarebbe la mia raccomandazione.

Ecco alcune note sulle mie scelte per questi articoli.

  • Il byte iniziale (0xc5) è un modello di bit distintivo, relativamente improbabile che si verifichi per caso, in cui metà dei bit è disattivata e metà attivata. Ciò lo rende relativamente facile da trovare con strumenti di debug incluso un oscilloscopio.
  • Il byte finale è lo stesso invertito, per ragioni simili.
  • Includere la lunghezza è il tipo più semplice di controllo per errori di frame o byte persi. Se il byte iniziale, il byte finale e la lunghezza corrispondono al pacchetto è probabilmente valido.
  • Il byte di comando di 0x01 consente spazio per l'espansione con futuri tipi di pacchetto. Tutti i pacchetti dovrebbero avere il formato c5,length,cmd,data...,5c .
  • I dati vengono inviati in formato little-endian, che può essere più semplice da leggere per alcuni server. Si prega di notare l'uso corretto di shift mask.

Come suggerito in un commento, l'aggiunta di un semplice checksum migliorerebbe la probabilità di rilevare errori su una linea rumorosa. Un semplice XOR rotante dovrebbe essere sufficiente e facile da codificare.

    
risposta data 22.04.2014 - 06:17
fonte
0

Senza fare ricerche sull'argomento, suggerirei quanto segue. Quindi, puoi inviare rapidamente i due byte? In tal caso, vorrei suddividere il codice nella base 512 da binario e utilizzare i seguenti numeri per i comandi speciali. Ad esempio ...

514 = Nuovo flusso di dati DATA CHUNK DATA CHUNK DATA CHUNK DATA CHUNK ... 513 = Interrompi flusso di dati

Quindi riconvertire in binario e deserializzare in un flusso di memoria o qualcosa del genere. Ciò ti lascerebbe con una grande quantità di comandi di base per comunicare con

EVENTO # 1 - 600 EVENT_PARAMSTART = 550 Param Chunk # 1 Param Chunk # 2 EVENTO PARAMSTOP = 551 EVENTEND = 599

Questo aiuto o sono totalmente fuori base? XD

    
risposta data 22.04.2014 - 05:59
fonte

Leggi altre domande sui tag