-
- Надеюсь CRC у вас будет наличествовать? При кодировании COBS при сбое даже в одном бите весь пакет фтопку нужно пускать. В отличие от какого-нибудь Modbus ASCII или RTU где, во-первых, изначально предусмотрена LRC/CRC и, во-вторых, даже необнаруженный единичный сбой в самом худшем случае значение лишь одного регистра/переменной испортит. - rezident(08.12.2021 12:36)
- COBS требует для формирования пакета знать наперёд его содержание
до 254 байт. Подход довольно простой: ищем сколько ненулевых
октетов следует в буффере (но не более 254), записываем N + 1,
записываем эти байты. Второй и последующие подряд идущие нули,
логично, кодируются как 0x1 (перед нами идёт 0 ненулевых октетов) - lloyd(08.12.2021 10:47)
- Октетом вы называете байт? Почему привычно не назвать байтом? Что
такое N? Куда записываем N + 1? Куда записываем "эти байты"? Почему
второй и последующие нули кодируются 0x1? Их не получится спутать с
настоящими 0x1? - Argon(08.12.2021 10:52)
- Байт - это минимально адресуемая ячейка памяти процессором. У
C2000, к примеру, байт 16-битный. А октет всегда 8-битный. lloyd(635 знак., 08.12.2021 11:28)
- "11 22 00 00 -> 03 11 22 01 00" А почему второй эээ... октет
00 не превратился в 01 ? - Argon(08.12.2021 11:54)
- а, понял - это не 00 данных, а разделитель пакетов, верно? - Argon(08.12.2021 12:05)
- Да, в COBS 00 - это признак окончания пакета, время, когда есть
смысл проверять содержимое на корректность. Технически, это можно и
на лету делать, но чуть замороченнее - lloyd(08.12.2021 12:51)
- ок, спасибо! - Argon(08.12.2021 12:52)
- Да, в COBS 00 - это признак окончания пакета, время, когда есть
смысл проверять содержимое на корректность. Технически, это можно и
на лету делать, но чуть замороченнее - lloyd(08.12.2021 12:51)
- а, понял - это не 00 данных, а разделитель пакетов, верно? - Argon(08.12.2021 12:05)
- "11 22 00 00 -> 03 11 22 01 00" А почему второй эээ... октет
00 не превратился в 01 ? - Argon(08.12.2021 11:54)
- Хех, во всех RFC, которые я читал, были октеты вместо байтов. Это у
них шиза какая-то. Якобы в старину бывали и не 8-разрядные байты. А
могли бы не выпендриваться и написать на первой странице своего
документа "у нас байт 8-разрядный". - SciFi(08.12.2021 11:19)
- В компилере для семейства C2000 размер байта 16 бит (да и память
там такая). И это не очень-то старина. - Vit(08.12.2021 11:44)
- Блин, эти "октеты" сбивают с толку. Даже в статейке про COBS на википедии говорится о байтах. Мы ведь обсуждаем байтовый протокол, где байт = 8 бит, зачем же усложнять объяснение? Иначе можно под каждым вторым сообщением на сахаре уточнять: "вы говорите о 8-битных байтах?" "Это не байт, а октет!" - Argon(08.12.2021 11:56)
- В компилере для семейства C2000 размер байта 16 бит (да и память
там такая). И это не очень-то старина. - Vit(08.12.2021 11:44)
- N - количество не нулевых байт подряд. N+1 передаем (записываем) перед этими не нулевыми байтами, сам нулевой байт не передаем (записываем). Если идет сразу ноль, тогда ненулевых байт ноль, передаем 0+1=1, сам ноль не передаем. Настоящий 0х01 не нулевой, он идет внутри ненулевых, сами ненулевые ни как не анализируются. - AlexBi(08.12.2021 11:08)
- Байт - это минимально адресуемая ячейка памяти процессором. У
C2000, к примеру, байт 16-битный. А октет всегда 8-битный. lloyd(635 знак., 08.12.2021 11:28)
- Октетом вы называете байт? Почему привычно не назвать байтом? Что
такое N? Куда записываем N + 1? Куда записываем "эти байты"? Почему
второй и последующие нули кодируются 0x1? Их не получится спутать с
настоящими 0x1? - Argon(08.12.2021 10:52)