Carácter NUL en un protocolo basado en ASCII sobre UART

Estoy desarrollando un protocolo UART basado en codificación ASCII. La comunicación es entre una PC y una placa STM32. El formato del paquete es así: Paquete: {STX,DATA,ETX} Donde están STX y ETX 0x02y Ox03en ASCII.
Ejemplo:

STX HELLO ETX en hexadecimal sería: 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03

Mi pregunta es ¿dónde está exactamente la posición del \0carácter en mi paquete? ¿Es después de ETX así: STX HELLO ETX \0 o después de HELLO así: STX HELLO\0 ETX ?

Es tu protocolo, tú eliges. ¿ Incluso necesitas el \0si terminas siempre con ETX?
Los valores nulos rara vez se usan en los protocolos de línea; en efecto, ETX cumple la función en su protocolo que cumple un valor nulo cuando un programa almacena internamente una cadena terminada en un valor nulo. Los búferes de paquetes generalmente rastrean la longitud, en lugar de usar un nulo de terminación, pero incluso si usan un nulo de terminación, se elimina al enviar y se agrega al recibir.

Respuestas (2)

Usted especifica su formato de paquete como {STX,DATA,ETX}.

Todo el contenido de DATOS del paquete se encuentra dentro del campo de DATOS, entre STX y ETX.

Si decide enviar cadenas terminadas en NUL en sus paquetes, NUL es parte de la cadena, parte de su campo de DATOS.

Entonces enviarías: STX HELLO\0 ETX

Diría que el terminador NUL de una cadena C es una característica del lenguaje C y no debe considerarse como parte de la cadena. La cadena real que se enviará sería solo los caracteres hasta, pero sin incluir, el NUL.
De hecho, esta respuesta es muy incorrecta y parece haber confundido al autor de la pregunta para que la acepte por error. El formato descrito originalmente simplemente no envía un nulo y, de hecho, la mayoría de los protocolos de línea no usan nulos . Si en algún momento un paquete con o sin tramas STX/ETX se almacena dentro de una computadora en una cadena C terminada en nulo en lugar de en un búfer de longitud designada, entonces se agregaría un nulo. Pero no es necesariamente el caso de que esto suceda en absoluto. Por lo general, solo verá cadenas terminadas en nulo al construir o deconstruir campos de paquetes.
@PeterBennett, la pregunta de OP dice "Estoy desarrollando un protocolo UART". Es la elección de OP cómo se envían las cadenas, como señalan otros.

depende de los DATOS (la palabra 'HOLA' en su ejemplo):

--si es una cadena terminada en nulo (una cadena C), en la que una cadena está representada por una matriz de caracteres terminados por un carácter nulo '\0',

o:

--si es una matriz 'normal' de caracteres.

entonces el paquete puede ser:

-- STX HELLO\0 ETX para la matriz de caracteres terminada en cero: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x00 0x03 ]

o:

-- STX HELLO ETX para la matriz de caracteres normal: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03 ]

o:

--¡el carácter nulo puede estar en cualquier parte del paquete!... es su protocolo, como comentó colin-s;

Si bien esto incluye la posibilidad abrumadoramente habitual, la has enterrado en el medio y no has explicado realmente por qué es lo habitual.
@chris-stratton: no tengo ninguna intención de 'explicar por qué esa es la posibilidad habitual'... solo mencioné 'algunas' posibilidades ya que la pregunta es un poco general...