Символ NUL в протоколе на основе ASCII через UART

Я разрабатываю протокол UART на основе кодировки ASCII. Связь осуществляется между ПК и платой STM32. Формат пакета такой: Пакет: {STX,DATA,ETX} Где STX и ETX 0x02и Ox03в ASCII.
Пример:

STX HELLO ETX в шестнадцатеричном формате: 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03

Мой вопрос: где именно находится позиция \0символа в моем пакете? это после ETX так: STX HELLO ETX \0 или после HELLO так: STX HELLO\0 ETX ?

Это ваш протокол, вам выбирать. Вам даже нужно, \0если вы всегда заканчиваете ETX?
Нули редко используются в линейных протоколах, по сути, ETX выполняет роль в вашем протоколе, которую выполняет нуль, когда программа внутренне сохраняет строку с нулевым символом в конце. Буферы пакетов обычно отслеживают длину, а не используют завершающий нуль, но даже если они используют завершающий нуль, он удаляется при отправке и добавляется при получении.

Ответы (2)

Вы указываете свой формат пакета как {STX, DATA, ETX}.

Все содержимое DATA пакета содержится в поле DATA между STX и ETX.

Если вы решите отправлять в своих пакетах строки с завершением NUL, тогда NUL является частью строки — частью вашего поля DATA.

Таким образом, вы должны отправить: STX HELLO\0 ETX

Я бы сказал, что терминатор NUL строки C является особенностью языка C и не должен рассматриваться как часть строки. Фактическая строка, которая будет отправлена, будет состоять только из символов до, но не включая, NUL.
Действительно, этот ответ очень неверен и, похоже, сбил с толку спрашивающего, заставив его ошибочно принять его. Первоначально описанный формат просто не отправляет null, и действительно, большинство линейных протоколов не используют null . Если в какой-то момент пакет с кадрированием STX/ETX или без него хранится внутри компьютера в строке C с нулевым окончанием, а не в буфере с обозначенной длиной, тогда будет добавлен нуль. Но не факт, что это вообще произойдет. Обычно вы видите только строки с завершающим нулем при построении или деконструкции полей пакета.
@PeterBennett, вопрос ОП гласит: «Я разрабатываю протокол UART». Как отмечают другие, выбор OP, как строки отправляются.

это зависит от ДАННЫХ (слово «ПРИВЕТ» в вашем примере):

--если это строка с завершающим нулем (C-строка), в которой строка представлена ​​массивом символов, оканчивающихся нулевым символом '\0',

или:

--if это "нормальный" массив символов.

поэтому пакет может быть:

-- STX HELLO\0 ETX для массива символов с завершающим нулем: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x00 0x03 ]

или:

-- STX HELLO ETX для обычного массива символов: [ 0x02 0x48 0x45 0x4c 0x4c 0x4f 0x03 ]

или:

--нулевой символ может быть где угодно в пакете!... это ваш протокол, как прокомментировал colin-s;

Хотя это включает в себя чрезвычайно обычную возможность, вы похоронили ее посередине и не смогли действительно объяснить, почему это обычно.
@chris-stratton: у меня нет намерения «объяснять, почему это обычная» возможность ... я упомянул только «некоторые» возможности, поскольку вопрос немного общий ...