_3m 19 April 7, 2022 Posted April 7, 2022 (edited) · Report post Задача перекликается с темой "Как совместить текст и поток данных в RS-232 ?" Имеется последовательная шина RS485 на ней много устройств разных типов: мои и сторонние. И понадобилась такая штука как логическое отключение/подключение устройства от шины (для общения со "сторонними" устройствам используется протокол XMODEM а он гонит бинарные данные и их нужно игнорировать). С отключением просто: подаем адресную команду и выбранное устройство начинает отбрасывать все принятые байты. Но возникает проблема как его потом включить ? Сейчас мое устройство ждет тишину в линии в течение заданного времени, потом break + специальную последовательность символов для возврата в командный режим. Как оказалось такое решение неудачное. Понадобилась работа через разнотипные интерфейсы: usb-serial, bluetooth-serial, tcp-serial и даже через радиомодем. Ни break ни смену четности ни времянки между байтами нельзя использовать потому что разнотипные интерфейсы не умеют ничего кроме передачи байт на какой то одной фиксированной скорости и не гарантируют времянки. Таким образом мы имеем абстрактный поток передаваемых и принимаемых байт в которых нужно каким то образом сигнализировать об окончании бинарного обмена при этом не вмешиваясь в бинарные данные. Edited April 7, 2022 by _3m Quote Share this post Link to post Share on other sites More sharing options...
jcxz 356 April 7, 2022 Posted April 7, 2022 · Report post 29 минут назад, _3m сказал: Таким образом мы имеем абстрактный поток передаваемых и принимаемых байт в которых нужно каким то образом сигнализировать об окончании бинарного обмена при этом не вмешиваясь в бинарные данные. Самый простой вариант: на всех приёмниках запускать XMODEM-приём, на время XMODEM-передачи. Только пассивно: не генерить ответы в линию, а в режиме сниффера - чужие ответы учитывать. И тогда - пройдя всю логику обмена XMODEM, обнаруживать его конец. Но конечно если у вас устройства могут включаться в обмен по шине в произвольные моменты времени (хоть в середине XMODEM-передачи), то такой костыль не прокатит. PS: а по уму - надо выбрасывать весь этот колхоз, и переводить все устройства на единый протокол обмена. Тогда не придётся костыли выдумывать. Quote Share this post Link to post Share on other sites More sharing options...
mantech 131 April 17, 2022 Posted April 17, 2022 (edited) · Report post 07.04.2022 в 14:28, _3m сказал: Но возникает проблема как его потом включить ? ИМХО. В одной шине должен быть только один протокол! А сторонние пакеты должны быть "завернуты" в поля данных этого протокола, как делается в IP протоколе, например. Все остальное приведет к глюкам, коллизиям и геморрою, как в вашем случае... Ну а если последнее так уж вам по душе, то смотрите в сторону каких-либо magic-пакетов... Edited April 17, 2022 by mantech Quote Share this post Link to post Share on other sites More sharing options...
Stepanov 52 August 30, 2023 Posted August 30, 2023 · Report post Классическое решение - TLV. Блоки бинарных данных имеют преамбулу с указанием длины, а дальше либо текст либо еще блок данных, в котором может быть текст. https://en.wikipedia.org/wiki/Type–length–value Quote Share this post Link to post Share on other sites More sharing options...
kolobok0 4 August 30, 2023 Posted August 30, 2023 · Report post любые манипуляции с квитированием данных распадаются на два случая - вы используете некий заголовок в котором есть инфа на динамический хвост данных. либо второй вариант - вы постоянно мониторите поток на предмет "строба". второе обычно подходит для каналов которые в любой момент могут прерваться или начаться. по антивирусной теме (там где детектируются сигнатуры) - считается что достаточно около 11 байт, чтоб исключить ложные сработки (правда всё равно тестируется на частоту попадания по достаточно крупному чистому массиву данных). ну и как сказали выше - протокол лучше использовать один, заворачивая внутрь уже разношёрстные данные. с уважением (круглый) Quote Share this post Link to post Share on other sites More sharing options...