NUL-Zeichen in einem ASCII-basierten Protokoll über UART

Ich entwickle ein UART-Protokoll basierend auf ASCII-Codierung. Die Kommunikation erfolgt zwischen einem PC und einer STM32-Karte. Das Paketformat ist wie folgt: Paket: {STX,DATA,ETX} Wobei STX und ETX sind 0x02und Ox03in ASCII.
Beispiel:

STX HELLO ETX in Hex wäre: 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03

Meine Frage ist, wo genau ist die Position des \0Zeichens in meinem Paket? ist es nach ETX so: STX HELLO ETX \0 oder nach HELLO so: STX HELLO\0 ETX ?

Es ist Ihr Protokoll, Sie können wählen. Brauchst du überhaupt das \0if du endest immer mit ETX?
Nullen werden selten in Zeilenprotokollen verwendet, ETX erfüllt tatsächlich die Rolle in Ihrem Protokoll, die eine Null erfüllt, wenn ein Programm intern eine nullterminierte Zeichenfolge speichert. Paketpuffer verfolgen normalerweise die Länge, anstatt eine abschließende Null zu verwenden, aber selbst wenn sie eine abschließende Null verwenden, wird diese beim Senden entfernt und beim Empfangen hinzugefügt.

Antworten (2)

Sie geben Ihr Paketformat als {STX,DATA,ETX} an.

Der gesamte DATA-Inhalt des Pakets ist im DATA-Feld zwischen STX und ETX enthalten.

Wenn Sie sich entscheiden, NUL-terminierte Zeichenfolgen in Ihren Paketen zu senden, ist die NUL Teil der Zeichenfolge - Teil Ihres DATA-Felds.

Sie würden also senden: STX HELLO\0 ETX

Ich würde sagen, dass der NUL-Terminator eines C-Strings ein Merkmal der C-Sprache ist und nicht als Teil des Strings betrachtet werden sollte. Die tatsächlich zu sendende Zeichenkette wären nur die Zeichen bis einschließlich der NUL.
Tatsächlich ist diese Antwort sehr falsch und scheint den Fragesteller dazu gebracht zu haben, sie fälschlicherweise zu akzeptieren. Das ursprünglich beschriebene Format sendet einfach keine Null, und tatsächlich verwenden die meisten Leitungsprotokolle keine Nullen . Wenn irgendwann ein Paket mit oder ohne den Rahmen STX/ETX in einem Computer in einer nullterminierten C-Zeichenfolge und nicht in einem längenbezeichneten Puffer gespeichert wird, wird eine Null hinzugefügt. Aber es ist nicht unbedingt so, dass dies überhaupt passieren wird. Normalerweise sehen Sie beim Erstellen oder Dekonstruieren von Paketfeldern nur nullterminierte Zeichenfolgen.
@PeterBennett, OPs Frage lautet "Ich entwickle ein UART-Protokoll". Es ist OPs Wahl, wie Zeichenfolgen gesendet werden, wie andere anmerken.

es hängt von den DATEN ab (das Wort „HALLO“ in Ihrem Beispiel):

--wenn es sich um eine nullterminierte Zeichenfolge (eine C-Zeichenfolge) handelt, in der eine Zeichenfolge durch ein Array von Zeichen dargestellt wird, das mit einem Nullzeichen '\0' endet,

oder:

--wenn es sich um ein "normales" Array von Zeichen handelt.

Das Paket kann also sein:

-- STX HELLO\0 ETX für das nullterminierte Zeichenarray: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x00 0x03 ]

oder:

-- STX HELLO ETX für das normale Zeichenarray: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03 ]

oder:

--das Null-Zeichen kann überall im Paket sein! ... es ist Ihr Protokoll, wie colin-s kommentierte;

Während dies die überwältigend übliche Möglichkeit beinhaltet, haben Sie sie in der Mitte vergraben und nicht wirklich erklärt, warum dies die übliche ist.
@chris-stratton: Ich habe nicht die Absicht zu erklären, warum das die übliche Möglichkeit ist ... ich habe nur "einige" Möglichkeiten erwähnt, da die Frage etwas allgemein ist ...