что-то количество просмотров темы растет, хоть и неспешно, а новых сообщений все не появляется... видимо, не совсем понятно, ради чего весь этот сыр-бор я затеял: как бы сложность очевидна, а плюсы незаметны.
попробую пояснить примером.
многим знаком протокол
Wake, который достаточно широко применялся для создания "сетей" измерительных приборов, например.
предположим, есть нужда отправлять пакеты по этому протоколу. сложность заключается в том, что этот протокол подразумевает две далеко не тривиальные вещи: байтстаффинг данных и вычисление CRC пакета. сделать это вручную не так-то просто, если вы не пользуетесь моим пакетом OBSERVER

а с применением этого пакета все тривиально, но требует начальных однократных усилий.
показываю пример решения задачи:

поясняю рисунок:
1. Большинство блоков просто переименованы, далее описываю как и что.
2. Ввод ADR-CMD-DATA - это блок ввода данных. По названию понятно, что вводить нужно байт адреса "кому пакет", байт "команды" и произвольное количество байтов "данных" пакета (может отсутствовать).
3. Байтстаффинг - это блок замены списком, далее поясню подробнее.
4. Начало пакета+ - это блок ДОПОЛНЕНИЕ, т.е. блок, который добавит к началу данных байт "начало пакета" (это фиксированный протоколом байт, и вводить вручную его смысла нет, пусть добавляется автоматически)
5. CRC - это блок восьмибитной CRC, настроен на полином протокола Wake 0x31, начальное значение 0xDE, остальное 0.
6. AND - это блок, который делает единый пакет из двух частей
7. Последовательный порт в комментариях не нуждается - это транспорт для доставки пакета.
теперь немного подробностей, почему так, а не иначе.
пользователь вводит нужные байты адреса, команды и данных. ввод может быть в различном виде, это понятно. в итоге получается строка байтов, которая попадает на блок байтстаффинга, т.е. замены некоторых байтов на пары:
DB --->
DBDDC0 --->
DBDCто есть получается уже другая строка, к которой добавляется байт
C0 в самое начало - это признак начала пакета. но этот байт не должен заменяться байтстаффингом, поэтому он добавляется после того, как введенные пользователем данные обработаны.
теперь нужно дополнить пакет контрольной суммой, и тут небольшая проблемка: с одной стороны CRC должна считаться для пакета с байтстаффингом, с другой - сама должна пройти через байтстаффинг. и эта проблема решается "раздвоением" обработки: считается для подготовленного пакета CRC, подвергается байтстаффингу, а затем "приделывается" к подготовленному пакету - вуаля! все готово к отправке.
итак, нехитрыми манипуляциями всю работу по подготовке к отправке пакета для пользователя мы свели только к вводу действительно важных данных, ввод которых вряд ли кого затруднит, а рутину по "обрамлению", "обсчету" пакета и вычисления контрольной суммы берет на себя "конфигурация OBSERVER" - сохраняете ее и используете в дальнейшем для работы со своими девайсами по протоколу
Wake.
Разумеется, похожим образом можно наладить формирование пакета для различных протоколов и посложнее. Более того, можно реализовать еще более "гуманный" интерфейс, например, сделав дополнительный блок замены списком, при помощи которого заменять СИМВОЛЬНЫЕ КОМАНДЫ и/или НАЗВАНИЯ УСТРОЙСТВ на их байтовые коды, чтобы в итоге отправка данных делалась в таком виде:
VOLTMETER:READ: или
DIMMER:BRIGHT:12% (блок замены списком заменит VOLTMETER: на адрес вольтметра, DIMMER: на адрес диммера, READ: на код команды чтения значения, BRIGHT: на код команды установки яркости, знак процента заменит на "ничего", ну а 12 так и останется 12)
Добавлено after 3 minutes 29 seconds:само собой, аналогичным использованием блоков замены списком, CRC и т.п. можно "расшифровывать" и пакеты, возвращаемые устройствами по протоколу Wake, чтобы показывать в консоли (или где там хочется - на стрелочных приборах, возможно) уже "человекочитаемые" результаты.
- Вложения
-
- wake-1.png
- (9.02 KiB) Скачиваний: 2970