Сеть посредством RS485

Тема в разделе "Проводная и беспроводная связь", создана пользователем DrProg, 4 фев 2016.

  1. DrProg

    DrProg Вечный нерд

    Спасибо, я почитаю вашу рализацию и вникну, может быть что то утащу или научусь чему нибудь полезному.

    С мастером у меня так. Он оправляет пакет ведомому и читает приходящие данные проверяя адрес. Если пакет ему, то заносит пришедший байт в специальный массив. Если не ему, то игнорирует. Если пакета нет вовсе, то просто ждет пока придет время следующей отправки. По истечении времени на паузу отправляет следующий пакет следующему устройству, если линия свободна. То есть пока какой нибудь ведомый передает данные, мастер молчит и ждет тишины. В реальности такое врядли будет происходить, разве что один из ведомых захочет всем коллегам что то написать и не уложится в тайм аут, но алгоритмом такой случай предусмотрен. В целом внимание большое уделено тому, чтобы устройства говорили по очереди.
     
  2. Alex19

    Alex19 Гуру

    Не за что, тут все помогают друг другу.

    Она не моя, вырезана из проекта MultiWii и лишь слегка дополнена. Сейчас она и дальше модернизируется, когда закончу опубликую в проекте, который используется.

    Рекомендую посмотреть не только MultiWii, но и проект Marlin (3D принтер), ArduCopter, grbl. Найдете очень много интересных и полезных решений.

    Вообще, когда опускаюсь (один из форумчан, считает подымаюсь:)) на AVR + Си, все становится более надежным, оперативным и не создает головной боли. Но пока, для меня это требует большего времени чем просто работать с обычными библиотеками.
     
  3. Onkel

    Onkel Гуру

    как хорошо, когда топики вроде "дрожит серва и ничего не могу сделать" тебя не касаются, когда программируешь прямо на С, или когда без проблем можешь любой фрагмент на асе включить в код, или когда ты четко знаешь, чем у тебя в любой момент какой таймер занят. Вот это "опускаюсь" или "поднимаюсь"?
    с тем же 485 - я когда его осваивал все завелось с полпинка, я тестил 10^^8 посылок из 8 байтов и не нашел ни одного сбоя.
     
  4. Alex19

    Alex19 Гуру

    Мне до Вашего уровня еще идти и идти, учитывая, что время на хобби не много.

    Просто для меня код Arduino IDE, это некий фреймворк высокого уровня, который скрывает от пользователя архитектуру и особенность контролера. Он построен на работе с готовыми библиотеками на C++, которые мы просто используем, зачастую даже не разбираясь как они написаны.

    Чуть ниже идет работа с регистрами AVR на Си или С++ (ведь фреймворк Arduino IDE, базируется именно на работе с регистрами и C++), там уже нужно понимать для какого контролера ты пишешь, его особенности.

    А еще ниже ассемблер (он же и есть низкоуровневый язык программирования), для которого нужно досконально знать не только сами команды, особенности контролера, его архитектуру.

    Поэтому для меня это опускаюсь, но не в смысле ухудшения кода.

    Стремлюсь писать код для AVR (очень полюбил прерывания и не понимаю, как без них жить) + Си, но далеко не для всех проектов, лишь для тех, где это необходимо, хоть и в Arduino IDE. Ассемблер мне не доступен, по ряду причин.

    Это лишь мой взгляд, программиста любителя:).
     
  5. DrProg

    DrProg Вечный нерд

    Немного поднял устойчивость передачи данных на любых скоростях. А именно до 100%. Причина была в "надкусывании" первого байта в начале приема пакета в результате чего пакет игнорировался. Почему так происходило именно на низких скоростях (вплоть до 9600) и не наблюдалось при скоростях высоких предстоит еще осознать, но факт остается фактом. Побороть это явление удалось при помощи отправки одного дополнительного незначащего байта перед пакетом. В моем примере это 0хFF, который замечательно виден в начале каждого пакета на анализе уровней.
    [​IMG]
    Записано на скорости 1200, при которой раньше потери составляли более 50%. Теперь все работает замечательно.

    Да и еще, спаcибо Onkel за программу HTerm. Удобная вещь для анализа происходящего на шине данных, в том числе благодаря ей были замечены регулярные искажения начальных байтов.
     
    Последнее редактирование: 8 фев 2016
  6. Onkel

    Onkel Гуру

    ну это спасибо автору этой замечательной программы.
    "надкусывание" может быть связано с неисправностью чипа rs485. Наблюдал это явление, Замена чипа приводила к абсолютному результату. Причем один чип может откусывать всю сеть.
     
    DrProg нравится это.