Ein Weg Bytestrom zu Paketstrom in C89 auf einem Embedded-Gerät zu konvertieren [geschlossen]

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich arbeite mit einem Embedded-Gerät an, das an den PC angeschlossen ist RS232 (RS232 über USB) verwendet wird.

Ich denke an mein eigenes Protokoll zu entwickeln:

<MAGIC><LENGTH><BINARY DATA><CRC>

, aber ich will nicht das Rad neu zu erfinden.

Bitte Hinweis , dass: Ich denke an sehr eingeschränkt Gerät. 4 KB RAM, keinen Kern, noch Standard-C-lib

Können denken Sie über einen Standard-Weg, um diese (vielleicht Open-Source-Bibliothek) zu tun?

Wenn Sie eine eigene Lösung codieren tun alle Best Practices haben?

  • Haben Sie MAGIC Bytes verwenden auch am Ende der Pakete?
  • Vielleicht ist es besser, Zeitlücken statt Trennzeichen zu verwenden?
  • Wie finden Sie den Anfang der Pakete in einem Strom von Binärdaten?
  • Vielleicht ist es besser, Text-Protokolle zu verwenden?

UPDATE: Bitte wiederholen Sie die Frage lesen. Ich soll nicht für Bibliothek fragen, aber für gute Praktiken.

War es hilfreich?

Lösung

Siehe diese Antwort, die ich auf eine sehr ähnliche Frage gab in Bezug auf Einzelheiten eines einfachen Protokolls.

auf Ihre spezifischen Punkte antworten:

  1. „Magic“ Bytes am Ende von Paketen tun keinen Schaden, aber sie sind überflüssig, wenn Sie bereits wissen, wie lange das Paket sein sollen, und eine CRC.
  2. Es kann sinnvoll sein Timeout-Zeiten specifiy, so dass, wenn es zu groß ist eine Lücke zwischen dem Bytes innerhalb eines Pakets, dann wird ein Fehler angezeigt. Verwendet Modbus , bin ich der Wert nicht davon überzeugt, an anderer Stelle der Verwendung von zeitbasierten Trennzeichen.
  3. Sie meinen „wie finden Sie den Anfang von Paketen in einem Strom von binären Daten“? Wenn ja, vielleicht eine minimale Lücke zwischen den Paketen angeben, und / oder dem Empfänger benötigt nach jedem Paket acknolwedge.
  4. macht es einfacher für das Debugging und erfordert keine spezielle Software auf dem PC, aber nicht sehr effizient. Natürlich, wenn die Benutzerfreundlichkeit wichtiger als Effizienz ist, als ein textbasiertes System ist durchaus angemessen.

Andere Tipps

Für so etwas wie dies durch die Zeit, die Sie eine bestehende Lösung erhalten auf dem Gerät zu arbeiten, wäre es einfacher gewesen, nur das Rad neu zu erfinden.

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);
    }
}

Oder vielleicht Ihr Problem, das ich bin unterschätzt. Wenn Sie suchen, wie die RS232-Bits in Ihrem Mikrocontroller Datenblatt aussehen zu erzeugen.

Das einzige, was es über die E / A Primitive wird die CRC-Berechnung sein. Es gibt einen netten Artikel, mit Code, hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top