AlexG (09.05.2013 17:19, просмотров: 141) ответил Ксения на Лично я ничего в нем не поняла - жуть какая-то! На мой взгляд USART устроен предельно примитивно: сперва проверяешь бит о том, что передатчик пуст, а потом в него кидаешь байт. А если по прерыванию, то то сразу кидаешь без проверки. Зачем же тут
Обычно у меня тоже все более-менее примитивно, но в этот раз в устройстве два порта и четыре переключаемых совершенно разнородных режима их работы (от отладочной печати до Modbus-RTU). Пришлось делать промежуточный слой устраняющий привязку кода к конкретному порту. Работает промежуточный слой просто: для каждого порта создается по объекту, у объекта есть метод Transmit, передающий данные из буфера который ему дают и есть метод для установки callback-функции обработки принимаемых данных, +внутри есть управление драйвером 485-го интерфейса. Такой набор оказался достаточно универсальным и позволяет в остальной части программы про физические USARTы не вспоминать. Чтобы переключиться с обмена по одному протоколу на обмен по другому на лету теперь достаточно сменить callback-функцию и перенастроить скорость и формат передачи вызвав пару методов класса. Сюда код выложил скорее чтобы показать имеющиеся проблемы - полностью уйти от дублирования кода обработчиков прерываний пока не удалось. Это вовсе не пример того как надо делать.