_3m 7 7 апреля, 2022 Опубликовано 7 апреля, 2022 (изменено) · Жалоба Задача перекликается с темой "Как совместить текст и поток данных в RS-232 ?" Имеется последовательная шина RS485 на ней много устройств разных типов: мои и сторонние. И понадобилась такая штука как логическое отключение/подключение устройства от шины (для общения со "сторонними" устройствам используется протокол XMODEM а он гонит бинарные данные и их нужно игнорировать). С отключением просто: подаем адресную команду и выбранное устройство начинает отбрасывать все принятые байты. Но возникает проблема как его потом включить ? Сейчас мое устройство ждет тишину в линии в течение заданного времени, потом break + специальную последовательность символов для возврата в командный режим. Как оказалось такое решение неудачное. Понадобилась работа через разнотипные интерфейсы: usb-serial, bluetooth-serial, tcp-serial и даже через радиомодем. Ни break ни смену четности ни времянки между байтами нельзя использовать потому что разнотипные интерфейсы не умеют ничего кроме передачи байт на какой то одной фиксированной скорости и не гарантируют времянки. Таким образом мы имеем абстрактный поток передаваемых и принимаемых байт в которых нужно каким то образом сигнализировать об окончании бинарного обмена при этом не вмешиваясь в бинарные данные. Изменено 7 апреля, 2022 пользователем _3m Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 224 7 апреля, 2022 Опубликовано 7 апреля, 2022 · Жалоба 29 минут назад, _3m сказал: Таким образом мы имеем абстрактный поток передаваемых и принимаемых байт в которых нужно каким то образом сигнализировать об окончании бинарного обмена при этом не вмешиваясь в бинарные данные. Самый простой вариант: на всех приёмниках запускать XMODEM-приём, на время XMODEM-передачи. Только пассивно: не генерить ответы в линию, а в режиме сниффера - чужие ответы учитывать. И тогда - пройдя всю логику обмена XMODEM, обнаруживать его конец. Но конечно если у вас устройства могут включаться в обмен по шине в произвольные моменты времени (хоть в середине XMODEM-передачи), то такой костыль не прокатит. PS: а по уму - надо выбрасывать весь этот колхоз, и переводить все устройства на единый протокол обмена. Тогда не придётся костыли выдумывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 48 17 апреля, 2022 Опубликовано 17 апреля, 2022 (изменено) · Жалоба 07.04.2022 в 14:28, _3m сказал: Но возникает проблема как его потом включить ? ИМХО. В одной шине должен быть только один протокол! А сторонние пакеты должны быть "завернуты" в поля данных этого протокола, как делается в IP протоколе, например. Все остальное приведет к глюкам, коллизиям и геморрою, как в вашем случае... Ну а если последнее так уж вам по душе, то смотрите в сторону каких-либо magic-пакетов... Изменено 17 апреля, 2022 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stepanov 8 30 августа, 2023 Опубликовано 30 августа, 2023 · Жалоба Классическое решение - TLV. Блоки бинарных данных имеют преамбулу с указанием длины, а дальше либо текст либо еще блок данных, в котором может быть текст. https://en.wikipedia.org/wiki/Type–length–value Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 30 августа, 2023 Опубликовано 30 августа, 2023 · Жалоба любые манипуляции с квитированием данных распадаются на два случая - вы используете некий заголовок в котором есть инфа на динамический хвост данных. либо второй вариант - вы постоянно мониторите поток на предмет "строба". второе обычно подходит для каналов которые в любой момент могут прерваться или начаться. по антивирусной теме (там где детектируются сигнатуры) - считается что достаточно около 11 байт, чтоб исключить ложные сработки (правда всё равно тестируется на частоту попадания по достаточно крупному чистому массиву данных). ну и как сказали выше - протокол лучше использовать один, заворачивая внутрь уже разношёрстные данные. с уважением (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться