Un modo per convertire il flusso di byte in flusso di pacchetti in C89 su un dispositivo incorporato [chiuso]
-
03-07-2019 - |
Domanda
I & # 8217; m sto lavorando con un dispositivo incorporato collegato al PC usando rs232 (rs232 su USB).
I & # 8217; m sto pensando di sviluppare il mio protocollo:
<MAGIC><LENGTH><BINARY DATA><CRC>
ma non & # 8217; non voglio reinventare la ruota.
Ti preghiamo di notare che: sto pensando a un dispositivo abbastanza limitato: 4kb di RAM, nessun kernel, né lib lib standard.
Riesci a pensare a un modo standard per farlo (forse libreria open source)?
Se codifichi la tua soluzione, hai delle migliori pratiche?
- Usi i byte MAGIC anche alla fine dei pacchetti?
- Forse è meglio usare intervalli di tempo anziché delimitatori?
- Come si trova l'inizio dei pacchetti in un flusso di dati binari?
- Forse è meglio usare i protocolli di testo?
UPDATE: Si prega di leggere nuovamente la domanda. Non dovrei chiedere la biblioteca ma buone pratiche.
Soluzione
Vedi questa risposta ho dato a una domanda molto simile per quanto riguarda i dettagli di un protocollo semplice.
Per rispondere ai tuoi punti specifici:
-
&
- quot; quot magia &; i byte alla fine dei pacchetti non fanno alcun danno, ma sono ridondanti se sai già quanto dovrebbe durare il pacchetto e hanno un CRC.
- Può essere sensato specificare i tempi di timeout, quindi se c'è un divario troppo grande tra i byte all'interno di un pacchetto, viene segnalato un errore. Avendo usato Modbus , non sono convinto del valore dell'uso di delimitatori basati sul tempo altrove.
- Intendi, " come trovi l'inizio dei pacchetti in un flusso di dati binari " ;? In tal caso, forse specificare un divario minimo tra i pacchetti e / o richiedere al destinatario di riconoscere dopo ogni pacchetto.
- Semplifica il debug e non richiede alcun software speciale sul PC, ma non molto efficiente. Naturalmente, se l'usabilità è più importante dell'efficienza, un sistema basato su testo è del tutto appropriato.
Altri suggerimenti
Per qualcosa di simile quando si ottiene una soluzione esistente per funzionare sul dispositivo, sarebbe stato più semplice reinventare la ruota.
void buffer_packet(unsigned char rx_byte)
{
static unsigned char byte_count = 0;
static unsigned char packet[8];
packet[byte_count++] = rx_byte;
if (byte_count == 8)
{
unsigned char crc = calculate_crc(packet, 8);
write_uart(0x55);
write_uart(8);
while (byte_count--)
{
write_uart(packet[7 - byte_count]);
}
write_uart(crc);
}
}
O forse sto sottovalutando il tuo problema. Se stai cercando come generare i bit RS232, consulta la scheda tecnica dei microcontrollori.
L'unica cosa al di là delle primitive I / O sarà il calcolo CRC. C'è un articolo elegante, con codice, qui .