rs485 master-master

Тема в разделе "Arduino & Shields", создана пользователем zserg, 10 ноя 2017.

Метки:
  1. zserg

    zserg Нерд

    Ну, не совсем так, но есть 2 устройства, связанные по rs485, и оба могут посылать события друг другу. То есть вариант "периодически мастер опрашивает ведомого" не подходит. Пробовал разные варианты, пока сделал так, что инициатива всё равно исходит от одного, он периодически посылает пакеты с нагрузкой либо KeepAlive. Второй в ответ шлёт либо свою нагрузку, либо тоже KeepAlive.
    Но всё равно периодически синхронизация теряется. Один опрашивает RFID и может подвисать в эти моменты, второй работает в wifi и тоже может отвлекаться, возможно, дело в этом.
    Не делал ли кто-нибудь подобных проектов? Где бы найти работающий вариант похожего взаимодействия? А то уже месяц бьюсь воскресными вечерами :)

    PS: Чтобы было понятнее - одно устройство = контроллер нагрузки + wifi с удалённым управлением. Второе - пульт на расстоянии метра-полутора от него. Пульт с клавиатурой, RFID-приёмником и лампочками-динамиком. Соответственно, контроллеру (он у меня мастер) надо от пульта получать введённые кнопки и данные карт, и самому командовать зажигать лампы и включать динамик.
     
  2. sslobodyan

    sslobodyan Гик

    У вас не должно быть никаких длительных обработок в прерываниях. То есть все длительные процессы должны идти в главном цикле без запрета прерываний. Максимальная задержка в прерывании должна быть не более длительности посылки одного байта, то есть 10 бит. Тогда не будут пропадать прерывания по приходу байта на усарт. Ну а дальше уже сами разруливаете. Не знаю, на чем пишете, но в ардуино сериал сам набирает свой приемный буфер по прерыванию прихода символа, а в аврстудии придется самостоятельно обслуживать прерывание. Ну и в мультимастерном режиме я не знаю других методов, кроме как запрос-ответ с подтверждением и псевдослучайной паузой в случае столкновения пакетов, или жесткого распределения времени запросов по таймслотам между мастерами с пересинхронизацией по последнему принятому пакету.
     
  3. DIYMan

    DIYMan Guest

  4. qwone

    qwone Гик

    Всего 2 устройста в сети и не могут договориться кто мастер. Это что хохлосеть(Гетьман-холоп , вместо мастер =слейв). Всего два хохла и оба хотят быть гетьманами. Человечнее надо делать сеть.
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

  6. sslobodyan

    sslobodyan Гик

    Изятрансфер отличная библиотека, но для одного мастера. На сколько я знаю, определять коллизии она не умеет.
     
  7. qwone

    qwone Гик

    А вот что бы не было колизий и нужен мастер. Мастер это не гетьманство, когда можно плевать на народ, а ответсвенность. Как минимум мастер примерно хотя бы раз 1 секунду проводить перекличку: "Алло народ вы живы?" или "Тело на сиденье №1 живо?" .И в ответ должно получить ответ" Я тело на сиденье 1-живой !!". Что разумеется далеко от желаний "гетмана". Так и здесь. Мастер просто раз в 1секунду говорит: Есть кто хочет что то сказать народу в течении 0,5 сек" и получить ответ "Я хочу сказать" или "Мне нечего сказать" и все.
     
  8. ostrov

    ostrov Гуру

    Расскажите мне в теории как разгребаются коллизии? Например, для ясности, может совпасть так, что сложение двух сигналов даст сплошную длинную единицу (или ноль). И какой арбитраж разберет где здесь чье?
     
  9. Tomasina

    Tomasina Сушитель лампочек Модератор

    Вот мультимастер, использует такой подход: каждые N миллисекунд мастером становится следующее звено в цепочке, остальные переходят в режим прослушки.
     
    arkadyf нравится это.
  10. qwone

    qwone Гик

    Что бы не было коллизий надо больше слушать, и меньше говорить. А еще слушать то что говоришь сам. И если слышишь совсем не то ,что говоришь, то это значит кто-то бубнит под ухом. И лучше замолчать и послушать что это за речь. Может это препод вам дает нужные знания на уроке.
     
    arkadyf нравится это.
  11. zserg

    zserg Нерд

    Ну, я про это и написал, кажется, Вы прочли только заголовок, но не прочли пост. Всё, о чём Вы писали у меня учтено...
    А вот за это спасибо. Теперь надо только придумать как перепосылки организовать... Может всё-таки у Вас это из практики и есть какой-то код, это реализующий?

    Пока я использую подход, аналогичный, мультимастеру, как прислал Tomasina (точнее у меня один мастер, он шлёт раз в 0.1 сек пакет данных или keepalive, в ответ слейв ему шлёт свои данные или keepalive). Задержки на окончание передачи учёл, но всё равно через минуту-две всё подвисает, как будто оба висят в приёме... Уже вроде и таймауты у обоих есть, но всё равно не могу отловить ошибку (и на консоль отладку не выплюнешь - по ней у меня всё бегает, на на softserial esp8266 не работает, шлю отладку в MQTT (дада, такой изврат)). Вот и ищу хоть какой-то проверенный код :)
     
  12. ostrov

    ostrov Гуру

    74HC125
     
  13. qwone

    qwone Гик

    Скорее всего у меня не будет проверенного под вас кода. Бывает так , что стиль программирования своеобразен. Вот еще мастер должен слать сообщение на только в сеть, но и в стек.вместе с временем отправки. Если на сообщение пришел ответ, то снять из стека . А если ответа нет , то послать повторно. 10 повторых не дошло. Снять и выключить адресат из белого списка и больше ему сообщений не слать. У вас по каналу сообщение идет с ошибкой. Слейв ждет повтора, а мастер ответа. В общем все ждут.... вашего решения.
     
  14. ostrov

    ostrov Гуру

    Я намекнул на интересную микросхему. С ее помощью одним устройством можно эффективно "затыкать" другое, пока говорит оно само.
     
  15. rkit

    rkit Гуру

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