ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба Нет иного программирования, кроме ООП, и С++ его пророк. Однако, не могу понять, как следовать этой вере. Есть у меня Com-порт, по которому компьютер передает команды прибору и получает результаты их выполнения. В микроконтроллере делаю кольцевые буферы для приема и передачи. Чтобы писать и читать в них, имею по паре указателей. Чтобы контролировать, что указатели в пределах буферов, имею пару констант - границ. Принимаю и отправляю сообщения в прерываниях. Для разбора принятой команды - своя функция, для выполнения - несметная масса функций. Ответ опять же в буфере надо подготовить. Вопрос - Какой класс объекта мне создать? Хочу Com_port, например. Но функции выполнения команд, логично, в нем быть не должны. Тогда и разбор команды - тоже? Тогда доступ к буферам должен быть снаружи класса. И прерывания - их же не спрячешь в класс? В общем, как раньше не мог сообразить, так и сейчас. И терпеть нет мочи. Подскажите, что и как робить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба COM порт + прерывания + кольцевой буфер - в один объект (сам буфер можно сделать отдельным объектом и использовать как член класса, если хочется) Разбор команды - другим объектом. Общаться между ними через метод типа 'взять строку' (ну или как они у вас там нарезаются) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба А вот прерывания - в обработчике прерывания, получив символ, обращаться к функции записи в буфер, принадлежащей объекту Com_port? Как бы, лишние дёргания. Я же не могу сам обработчик прерывания спрятать в класс? Теперь "взять строку" - не пересылать же строку из буфера порта в буфер, скажем, парсера? То есть, дать парсеру доступ в буфер порта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба В буфер складывает драйвер который обрабатывает прерывания. Он же выставляет флаг наличия новых данных. Т.е. по сути это одна функция. А уж объект занимается чтением флага и если находит его установленным читает данные и парсит их. На счёт передачи парсеру и доступа в буфер. Может быть по разному. Если жёсткая экономия времени то можно и указатель передать. Если не жёсткая то да складываем комманды в новый буфер и парсе их исполняет по мере сил и возможностей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladivolt 0 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 53 минуты назад, ViKo сказал: Чтобы писать и читать в них, имею по паре указателей. м.б. небесполезен и третий указатель -- просмотр без изъятия Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 2 минуты назад, Vladivolt сказал: м.б. небесполезен и третий указатель -- просмотр без изъятия Так я и читаю без изъятия. Я же микроконтроллер программирую. 10 минут назад, MegaVolt сказал: В буфер складывает драйвер который обрабатывает прерывания. Он же выставляет флаг наличия новых данных. Т.е. по сути это одна функция. Т.е., обработчик прерывания? Тогда ему и буфер принадлежит? Я не хочу иметь глобальный буфер. Или Com_port и будет являться драйвером? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladivolt 0 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 3 минуты назад, ViKo сказал: Так я и читаю без изъятия. Я же микроконтроллер программирую. Надо прояснить термины. Чтение из буфера - с освобождением прочитанного места для записи. Просмотр - данные остаются в буфере, блокируя запись и делая возможным повторный просмотр либо чтение. Нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 1 минуту назад, Vladivolt сказал: Надо прояснить термины. Чтение из буфера - с освобождением прочитанного места для записи. Просмотр - данные остаются в буфере, блокируя запись и делая возможным повторный просмотр либо чтение. Нет? Нет, повторного чтения не нужно. Зачем? Раз прочитал, считайте, освободил. Если команда правильная - выполнил. Нет - ответил "Ошибочная команда". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladivolt 0 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 7 минут назад, ViKo сказал: Если команда правильная - выполнил. Нет - ответил "Ошибочная команда". Как определяется момент "пора анализировать и исполнять команду"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 17 минут назад, Vladivolt сказал: Как определяется момент "пора анализировать и исполнять команду"? По символу конца строки (нуля, то есть). Вы меня вовлекаете в разговор, не относящийся к сути вопроса. Хотите иметь три указателя - пусть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба Самое простое - для коммуникационного обмена - базовый клас "packet" (формирование заголовка пакета, просчет CRC. Передача пакета. Прием пакета. При приеме - проверка заголовка, контрольной суммы, отслеживание таймаута приема, формирование кодов ошибок ) От него (packet) наследуется класс(ы) MyDevice_A_Protocol . . . . MyDevice_Z_Protocol (форматирование данных в пакет для передачи, парсер для приема) Например, на шине RS485 устр-ва, из которых считывается иформация, имеют различные форматы пакетов и/или алгоритмы подсчета CRC. Я принял веру, пройдя по этому пути .... :) ps Я так не делал, но можно packet в свою очередь унаследовать от самого "низкоуровневого" класс вроде frame_IO (самые низкоуровневые данные и функции, аналог аппаратного узла сетевого контроллера или драйвера конкретного узла конкретного контроллера). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 8 минут назад, k155la3 сказал: Самое простое - для коммуникационного обмена - базовый класс "packet" (формирование заголовка пакета, просчет CRC. Передача пакета. Прием пакета. Хорошо, так куда прерывание по приему символа впихнуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladivolt 0 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 3 минуты назад, ViKo сказал: По символу конца строки (нуля, то есть). Вы меня вовлекаете в разговор, не относящийся к сути вопроса. Хотите иметь три указателя - пусть. к сути вопроса - разделение ответственности... Приём байта по прерыванию. Обработчик только лишь складывает поступившие байты в fifo-буфер, либо же производит первичную обработку с целью разбора команды -- подсчёт длины в случае фиксированного формата, отслеживание признака конца строки и т.п. ? В первом случае обработчик универсален для разных задач, но требуется фоновый просмотр содержимого буфера (или даже банальный подсчёт заполненности) без изъятия(мой термин, возможно, неудачный) данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба Обработчик складывает в буфер и проверяет на конец строки. Если конец - дает сигнал задаче разбора. Так было. Еще вот что. Мне не нужно ничего наследовать. Я не пишу универсальных программ. Никаких базовых классов и т.п. Я просто хочу видеть свою программу более структурированной. Но не усложненной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 8 февраля, 2019 Опубликовано 8 февраля, 2019 · Жалоба 1 minute ago, ViKo said: Хорошо, так куда прерывание по приему символа впихнуть? Я не привязывал бы прием символа к ООП. На уровне прерываний имеет смысл отслеживать перерывы в передаче, заполнение буфера и анализ на заголовок пакета (если конечно, у Вас "пакетный" обмен данными а не "поточный"). Эти флаги - "отображать" на класс frame_IO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться