Проект представляет собой имплементацию простого и удобного протокола для шины RS485. В проекте не используются элементы библиотеки std C++, поэтому её можно использовать в проектах на Ардуино
Протокол моно-мастер - мульти-слейв. Арбитраж шины реализован через наличие только одного мастера на шине и отсутствии широковещательных сообщений от слейвов. Общее взаимодействие построено на мастере - инициаторе взаимодействия и дальнейшем обмене данными и подтверждениями от слейвов.
В протоколе V1.0 имеется следующий функционал:
- Сканирование шины для обнаружения слейвов (логика перебора адресов должна быть на клиентской стороне)
- Разделение устройств по адресам, адреса от 0 до 255
- Отправка команд с аргументами, строго u8
- Запрос данных размером до 255 байт от слейвов
- Взаимодействие на основе кодов возвратов команд и ACK-ов
Пример взаимодействий:
- Мастер отправляет Probe сообщения, если слейв получит такое сообщение и номер ноды совпадет то слейв отправит ACK с кодом 1
- Мастер с адресом 0xFF отправляет команду 0х01 с аргументом 0х02 слейву с адресом 0х03. Если слейв с данным адресом есть, идет проверка на наличие такой команды у слейва. Если слейв может выполнить команду, то он её выполняет и возвращает мастеру 0хFF сообщение ACK с кодом возврата > 1 (нулевой код возврата - ошибка) В случае если слейв не знает что это за команда то вернется ACK с кодом ошибки (сам код ошибки реализуется клиентом)
- Мастер делает запрос типа 0х01 к слейву и ожидает 10 байт в ответ. Если слейв знает о таком типе запроса и может выдать запрошенные 10 байт, то слейвом отправляется сообщение с ответом, где в payload будут запрошенные 10 байт. В случае если запрос не известен или количество байт неверно то вместо ответа вернется ACK с кодом ошибки. Далее, если мастер получает валидный ответ, то в ответ он отправляет ACK с кодом приема сообщения. В нем мастер может проинформировать слейв о том что присланные данные невалидны
Ограничения:
- Одна нода - один номер UID. Наличие нескольких нод с одинаковым UID недопустимо и вызовет ошибки арбитража
- Один мастер на шине. Данный протокол позволяет иметь несколько мастеров на шине, однако это гарантировано вызовет ошибки арбитража
- Слейвы не инициируют взаимодействия самостоятельно, см. пункт про арбитраж
- ACK с кодами возврата 0 и 1 зарезервированы. 0 - автоматический fail, обрабатывается внутри протокола. 1 - общий success, обрабатывается также внутри протокола
Фичи, которые возможно будут сделаны:
- Наличие у нод интерфейса собственных имен и возможность делать запрос имени слейва
- Наличие нескольких нод у одного слейва (например если будет необходима абстракция одного устройства как двух независимых)
- Мультимастер через передачу владения шиной для корректного арбитража
Сборка проекта:
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ../
make
Запуск тестов - из каталога build:
ctest
Запуск сборки документации:
doxygen Doxyfile