Знатоки, подскажите идею или может есть хорошее чтиво на тему... Задача вроде не сложная, но что то заклинило. Итак, есть железка, общается с компом через rs-232. cts/rts отключен, xon/xoff тоже. И изменить настройки невозможно Протокол общения довольно простой: есть маркер начала кадра, пусть будет 0xAB, маркера конца кадра нет. Если внутри кадра встречается 0xAB то оно заменяется на последовательность 0xBC, 0xF4 Кадр имеет определённую фиксированную структуру, присутствует несколько полей фиксированной длинны, плюс поле переменной длинны, длинна которого тоже передаётся в одном из полей. То есть окончательную длинну кадра можно вычислить прочитав одно из полей идущих в начале кадра. Но загвоздка в том что там указывается длинна ДО замены про которую писал выше. А сколько таких замен всего в кадре было неизвестно. В итоге фактическую длинну кадра остаётся только угадывать как то... Задача в том чтобы прочитать ровно один кадр. Можно конечно читать от маркера до маркера, один фиг маркеры особо не интересуют, но это сработает в том случае если в буфере уже есть один кадр и чутка следующего, но хотелось бы читать вне зависимости от наличия или отсутствия следующего кадра.

Комментарии: 9

  1. Evgeniy

    "указывается длинна ДО замены" - и пускай, читай дальше именно столько байт, сколько указано в загаловке, декодирование в процессе Маркер в конце решает проблемы такие

    • Artyom

      ок, прочитал я столько сколько указано. последний байт 0xBC.... Что делать дальше? читать ещё один или нет? Я бы прыгал от счатья....но имеем то что имеем

  2. Igor

    Байты в кадре идут непрерывно? Ну тогда конец кадра по паузе в передаче. А если кадры подряд, то ведь маркер следующего кадра уже в буфере, чем мешает то что он там уже лежит чтению предыдущего кадра? P.S. а в исходном сигнале последовательность BC-F4 никогда не может встретиться?

    • Artyom

      Вооооот! Спасибо за правильный вопрос, хороший человек, натолкнул на правильные мысли :) И лучи ненависти авторам документации.... в документации кое что умолчали, а выяснилось уже экспериментом. Дело в том что 0xBC заменяется на последовательность 0xBC 0xDD и таким образом если в конце прочитаных данных 0xBC то это гарантировано не последний байт кадра.

      • Andrey

        Байт стаффинг?

        • Igor

          Введи счетчик. Считываешь количество незашифрованных данных в начале кадра, считываешь очередной байт и добавляешь к счетчику 1 . Если считанеый BC, то проверяешь следующий на F4 и DD и на них счетчик не увеличиваешь. Счетчик переполнился-все данные считали. Угу. Только реализация может быть любая, как разработчик решит.

          • Artyom

            вот так и делал. затык был в конце... оказалось всё просто, но не описано

          • Igor

            Исправил текст, а то мутное описание получилось.

            • Artyom

              да я понял суть

Не нашли ответ?

Вам также может быть интересно