Skip to content

Протокол верхнего уровня для RS485

License

Notifications You must be signed in to change notification settings

V-Nezlo/UtilitaryRS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UtilitaryRS - протокол верхнего уровня для RS485

Проект представляет собой имплементацию простого и удобного протокола для шины 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

About

Протокол верхнего уровня для RS485

Resources

License

Stars

Watchers

Forks

Packages

No packages published