Un modo per convertire il flusso di byte in flusso di pacchetti in C89 su un dispositivo incorporato [chiuso]

StackOverflow https://stackoverflow.com/questions/815029

  •  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.

È stato utile?

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:

    &
  1. 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.
  2. 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.
  3. 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.
  4. 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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top