Добрый день!
Для реализации своей задумки мне необходимо соединить порядка 20 устройств по общей шине в режиме Multi-Master.
В любой момент любое устройство независимо должно иметь возможность отправить свое сообщение в шину.
Если любое из устройств зависает или ломается, оно не должно никоим образом влиять на работоспособность других устройств в сети.
Ввиду стоимости и простоты переноса в различные среды я хочу использовать RS-485 на общей шине.
Исходя из условий, приходится отмести условно-стандартный для указанного физического уровня Modbus.
Соответственно, приходится выдумывать некую свою поделку, отправной точкой я хочу взять описание протокола от zap: http://electrotransport.ru/ussr/index.php?...12449#msg112449
Кратко: muli-master протокол с гарантированной отправкой над первичным протоколом, способным отправлять байты, но не биты.
Контроллер всегда слушает то, что творится в линии. Если линия свободна от передаваемых данных, котроллер может передавать свои данные. Если передаваемый байт не совпал с принятым, значит произошла одновременная отправка с другим контроллером. В этом случае оба затыкаются на время передачи двух символов и выбирают на рандом - начать отправлять снова, или ждать.
В описанном протоколе необходимо и для чтения, и для отправки необходимо знать время отправки одного символа (байта).
Реализовать передачу данных в преобразователь (st485/max485 итп) и измерять эти интервалы можно двояко:
1. Подключать встроенный в микроконтроллер UART. Интервал измерять временем выполнения функции uart_write в пустоту, с отключенным DE в преобразователе RS-485.
2. Реализовать UART программно на таймере и прерываниях, из прерываний таймера знаем время передачи одного символа.
Как лучше поступить?
В первой реализации используется меньше кода, ибо железная реализация uart. Но не очень нравится костыляция с пустой отправкой байтов.
Во второй реализации больше кода, зато полностью управляемая система с прерываниями, никаких костылей.
Благодарю за ответы и рассуждения!