Перейти к содержанию
    

возврат в текстовый режим после бинарных данных

Задача перекликается с темой "Как совместить текст и поток данных в RS-232 ?"

Имеется последовательная шина RS485 на ней много устройств разных типов: мои и сторонние. И понадобилась такая штука как логическое отключение/подключение устройства от шины (для общения со "сторонними" устройствам используется протокол XMODEM а он гонит бинарные данные и их нужно игнорировать).

С отключением просто: подаем адресную команду и выбранное устройство начинает отбрасывать все принятые байты.
Но возникает проблема как его потом включить ? Сейчас мое устройство ждет тишину в линии в течение заданного времени, потом break + специальную последовательность символов для возврата в командный режим.
Как оказалось такое решение неудачное.
Понадобилась работа через разнотипные интерфейсы: usb-serial, bluetooth-serial, tcp-serial и даже через радиомодем. Ни break ни смену четности ни времянки между байтами нельзя использовать потому что разнотипные интерфейсы не умеют ничего кроме передачи байт на какой то одной фиксированной скорости и не гарантируют времянки.

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

Изменено пользователем _3m

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, _3m сказал:

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

Самый простой вариант: на всех приёмниках запускать XMODEM-приём, на время XMODEM-передачи. Только пассивно: не генерить ответы в линию, а в режиме сниффера - чужие ответы учитывать. И тогда - пройдя всю логику обмена XMODEM, обнаруживать его конец.

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

 

PS: а по уму - надо выбрасывать весь этот колхоз, и переводить все устройства на единый протокол обмена. Тогда не придётся костыли выдумывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

07.04.2022 в 14:28, _3m сказал:

Но возникает проблема как его потом включить ?

ИМХО. В одной шине должен быть только один протокол! А сторонние пакеты должны быть "завернуты" в поля данных этого протокола, как делается в IP протоколе, например. Все остальное приведет к глюкам, коллизиям и геморрою, как в вашем случае...

Ну а если последнее так уж вам по душе, то смотрите в сторону каких-либо magic-пакетов...

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Классическое решение - TLV. Блоки бинарных данных имеют преамбулу с указанием длины, а дальше либо текст либо еще блок данных, в котором может быть текст.

https://en.wikipedia.org/wiki/Type–length–value

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

любые манипуляции с квитированием данных распадаются на два случая - вы используете некий заголовок в котором есть инфа на динамический хвост данных. либо второй вариант - вы постоянно мониторите поток на предмет "строба". второе обычно подходит для каналов которые в любой момент могут прерваться или начаться. по антивирусной теме (там где детектируются сигнатуры) - считается что достаточно около 11 байт, чтоб исключить ложные сработки (правда всё равно тестируется на частоту попадания по достаточно крупному чистому массиву данных).

ну и как сказали выше - протокол лучше использовать один, заворачивая внутрь уже разношёрстные данные.

 

с уважением

(круглый)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...