Как узнать, что линия UART свободна для отправки данных

У меня есть несколько плат, которые общаются вместе с Rs485. У них есть ATMegaсерийные микроконтроллеры, такие как atmega168pили atmega8. Каждая плата может свободно отправлять данные в любое время , и у меня есть ограничения, которые приводят к тому, что я не могу использовать Modbus . Количество досок может варьироваться от 5 до 10.

Моя проблема: как плата может определить, свободна ли линия UART для отправки данных, и если она обнаружит, что шина занята, дождаться, пока шина освободится, а затем отправить собственные данные?

Существует ли специальный флаг или регистр, который может автоматически или вручную изменить его и позволить другой плате определить, что линия занята ?

Подобные ситуации могут быть одной из многих причин, по которым RS485 постепенно заменяется CAN.
Вы должны были использовать шину CAN. Теперь вам нужно отслеживать состояние шины уровня 2 .
как вы относитесь к 9битной связи в этом случае

Ответы (8)

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

RS-485 — это не протокол, это стандарт, определяющий электрические свойства полудуплексного (*) дифференциального канала. В спецификации нет ничего о том, как данные должны быть отправлены по этой ссылке, или о том, как эта ссылка фактически используется.

Таким образом, приемопередатчики RS-485 не имеют автоматического сигнала / флага / чего-либо «линия занята», как и микроконтроллеры со встроенными драйверами RS-485, а также микроконтроллеры, использующие ядро ​​​​UART, подключенное к внешнему приемопередатчику.

Вся реализация управления потоком и управлением направлением остается за любым протоколом, который вы используете. Существует несколько хорошо известных протоколов, использующих драйверы RS-485, например Modbus. Вы также можете реализовать любой протокол, который вы можете придумать.

Чтобы помочь вам, вот несколько идей для протоколов:

  1. У вас есть протокол типа master-slave. В нем есть главный узел, который координирует шину, и подчиненные узлы, каждый из которых имеет уникальный идентификатор.

    Ведомым узлам не разрешается отправлять какие-либо данные до тех пор, пока главный узел специально не отправит адресованные им команды. Как только ведомое устройство адресовано, оно может ответить на любую команду каким-то предопределенным образом, например, ответным пакетом фиксированной длины.

    В этом случае вы избегаете проблем с несколькими устройствами, желающими говорить одновременно, потому что мастер всегда координирует все.

  2. Вы можете использовать некоторую форму планирования, при которой каждое устройство на шине имеет фиксированный слот для отправки данных на любое другое устройство. Как только его слот заканчивается, он должен прекратить отправку и позволить следующему устройству говорить.

    Планирование может осуществляться самими устройствами без внешней координации. Первое устройство говорит, а затем отправляет сообщение о том, что все готово. Следующее устройство (например, со следующим более высоким идентификатором) будет знать, что оно может идти. В случае, если устройство не отвечает, у вас может быть некоторый тайм-аут, в течение которого каждое последующее устройство в расписании сможет сказать - ну, я какое-то время ничего не слышал от устройства до меня, так что должна быть моя очередь.


(*) Я полагаю, что он также определяет полнодуплексную версию с использованием двух дифференциальных каналов.

Я думаю, что в настройке с несколькими мастерами, поскольку у OP самая большая проблема заключается в том, чтобы синхронизировать новые / повторно подключенные станции с существующими, включая возможный сетевой разбиение.
Спасибо, Том ... Я думаю, что ваши 2 предложенных способа ведут к 1 вещи ... Подход Master Slave ... это хороший способ, если отправитель и получатель имеют достаточно ресурсов ... при использовании atmega8микроконтроллера, я думаю, что это приводит к нестабильности на устройстве спектакль
Но я думаю, что если использовать SOF и EOF для флага, чтобы уведомить всю доску о том, что линия занята , это может помочь. но необходимо указать идентификатор доски назначения, чтобы сказать специальной доске, что пакет « Это для вас », каково ваше открытие?
@combo_ci вы можете использовать маркеры пакетов (например, байт, добавленный к началу для обозначения SOF, и байт в конце для EOF), которые помогают уведомлять всех о том, что шина находится в середине кадра. Но вы также должны добавить обработку ошибок/тайм-аутов, чтобы сказать: ну, я получил SOF несколько секунд/минут/лет назад, но у меня еще нет EOF. Вам также нужно найти способ, чтобы два устройства не пытались говорить одновременно.
_Вам также нужно найти способ, чтобы два устройства не пытались говорить одновременно. _ это мой вопрос :) я думаю, что нет стандартного способа найти, что .maybe должен внедрить сам
@combo_ci да, поэтому предлагает такие варианты, как планирование или ведущий-ведомый. Это, вероятно, лучшие отправные точки для координации всех действий.

Это очень похоже на радиосвязь военных или полиции. Требуется протокол. Мастер-раб прост и хорош для большинства случаев. Но другой вариант - сделать это, как люди:

  1. Слушать.
  2. Если кто-то говорит - подождите.
  3. Если вы думаете, что никто не говорит, вы можете говорить.
  4. Дождитесь подтверждения.
  5. Если подтверждение не получено, говорите еще раз.
  6. Если вы хотите транслировать, попросите все станции подтвердить прослушивание.
  7. Если вы хотите поговорить с кем-то, кто вас не слышит, спросите, есть ли кто-то еще, кто может передавать.

И так далее. Может быть очень интересно реализовать. Удачи!

Это также используется для работы в сети: en.m.wikipedia.org/wiki/…
это хороший способ, но есть проблема, что если (по какой-либо причине) плата не может сказать, что я закончил , шина занята навсегда ... и если использовать таймер для обнаружения отсутствия занятости , это вызывает дополнительные накладные расходы на микроконтроллер, сделайте у вас есть способ решить эту проблему?
Также есть шанс, что брутальный мальчишка разнесет ваше устройство вдребезги. Извините, я не сказал, что все решаемо.
😊 Кстати спасибо Грегори
Интересный способ осмысления проблемы, особенно маршрутизации.
@downbeat, в частности, маршрутизирует технику отправки/получения?
Ну, он говорит, что вы "спросите, есть ли кто-нибудь еще, кто может передать". Я никогда не знал, что это часть протокола двусторонней радиосвязи, но в этом есть смысл. Это маршрутизация (хотя я серьезно сомневаюсь, что люди создают сложные таблицы маршрутизации, необходимые для маршрутизации с несколькими переходами).
Я думаю, что это обычное дело в этих ячеистых сетях.

Вот несколько возможностей решить вашу дилемму.

  1. Внедрить систему передачи токенов. Когда устройство имеет токен, ему разрешено передавать в течение ограниченного периода времени. Затем он передает токен следующему устройству. Должны быть предусмотрены условия для отсутствующих узлов, которые не могут получить и передать токен.
  2. Посмотрите на линию приема. Если он занят, сгенерируйте случайную задержку и повторите попытку. Случайная задержка помогает гарантировать, что ни один узел не сможет монополизировать окна передачи. Конфликты все еще могут происходить, но функция контрольной суммы может определить, не поврежден ли полученный пакет. Если он поврежден, получатель может запросить повторную передачу.
для старта номер 1 токен должен быть отправлен с доски, которая работает как Master ... на одной шине все платы получают токен, как токен может удерживаться на доске?
@combo_ci вы можете назначить мастера или согласовать отправителя токена, определив наименьший адрес шины или что-то подобное.
@combo_ci, вы можете попробовать передать его на определенное устройство в линии, через которое вы устанавливаете сеть

Как плата может определить, свободна ли линия UART для отправки данных,

общий ответ заключается в том, что без какого-либо протокола он не может сделать это надежно. обычно вы полагаетесь на контроллер или арбитра, чтобы узнать, занята линия или нет. Одним из простых способов может быть штифт OD, который тянет линию индикатора вниз перед передачей и отпускает ее после этого. Читая эту строку, передатчик может определить, доступна ли шина или нет.

менее надежная, но более простая система заключается в интеграции напряжения шины (например, через сеть ar/c).

и если он обнаружит, что шина занята, подождет, пока шина освободится, а затем отправит свои данные?

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

Я решаю эту проблему с помощью своих проектов, например, таким образом:

вместо того, чтобы использовать 2 контакта для связи, я использую 3 контакта. На коротких дистанциях работает. 3-й контакт — индикатор занятости линии. Этот штифт вытягивается со стороны мастера. Когда кто-то (MCU или что-то еще) хочет поговорить:

  • проверяет состояние этого вывода (INPUT).
  • если контакт ВЫСОКИЙ, то делает контакт низким (ВЫХОД)
  • и переговоры.
  • Когда сообщение передается, контакт (INPUT) (высокоимпедансный) освобождается, после чего контакт становится высоким.
  • Если штифт низкий, то ждет некоторое время, а затем возвращается, чтобы проверить цикл штифта.

Это реализация ответа Грегори Корнблюма.

Вы можете использовать стек протоколов BACnet с открытым исходным кодом для связи микроконтроллера по RS485, если вы не хотите использовать Modbus. По сути, он просто передает токен, который сообщает каждому устройству, когда оно может отправлять данные, аналогично топологии Token Ring и Ethernet. Вот пара ссылок для начала:

http://www.chipkin.com/bacnet-mstp-installation-rs485-and-cables/ http://bacnet.sourceforge.net/

Программное управление потоком

Как программному, так и аппаратному управлению потоком требуется программное обеспечение для выполнения задачи квитирования. Это делает термин «программное управление потоком» несколько вводящим в заблуждение. Имеется в виду, что при аппаратном управлении потоком в коммуникационном кабеле присутствуют дополнительные линии, сигнализирующие об условиях квитирования. При программном управлении потоком, также известном под названием управления потоком XON-XOFF, байты передаются отправителю по стандартным линиям связи.

Использование аппаратного управления потоком подразумевает, что между отправителем и получателем должно быть больше линий, что приводит к более толстому и дорогому кабелю. Таким образом, программное управление потоком является хорошей альтернативой, если оно не требуется для достижения максимальной производительности при обмене данными. Программное управление потоком использует канал данных между двумя устройствами, что снижает пропускную способность. Снижение пропускной способности в большинстве случаев, однако, не настолько удивительно, чтобы это было причиной не использовать его.

Два байта были предопределены в наборе символов ASCII для использования с программным управлением потоком. Эти байты называются XOFF и XON, потому что они могут останавливать и возобновлять передачу. Байтовое значение XOFF равно 19, его можно смоделировать, нажав Ctrl-S на клавиатуре. XON имеет назначенное значение 17, что эквивалентно Ctrl-Q.

Использование программного управления потоком легко. Если отправку символов необходимо отложить, по линии отправляется символ XOFF, для повторного перезапуска связи используется XON. Отправка символа XOFF только останавливает связь в направлении устройства, выдавшего XOFF.

Этот метод имеет несколько недостатков. Одно уже обсуждалось: использование байтов в канале связи занимает некоторую полосу пропускания. Еще одна причина более серьезная.

Квитирование в основном используется для предотвращения переполнения буфера получателя, буфера в памяти, используемого для хранения недавно полученных байтов. Если происходит переполнение, это влияет на способ обработки новых символов в канале связи. В худшем случае, когда программное обеспечение спроектировано плохо, эти символы выбрасываются без проверки. Если такой символ XOFF или XON, поток связи может быть серьезно поврежден. Отправитель будет постоянно предоставлять новую информацию, если XOFF потерян, или никогда не будет отправлять новую информацию, если XON не был получен.

Это относится и к линиям связи с плохим качеством сигнала. Что произойдет, если сообщение XOFF или XON не будет получено четко из-за помех на линии? Также необходимо соблюдать особую осторожность, чтобы отправляемая информация не содержала символов XON или XOFF в качестве информационных байтов.

Таким образом, последовательная связь с использованием программного управления потоком приемлема только тогда, когда скорость передачи данных не слишком высока, а вероятность переполнения буфера или повреждения данных минимальна.

высокоскоростной CSMA

Для высокой скорости, такой как определение несущей Ethernet CSMA , множественный доступ, обнаружение/предотвращение коллизий, со случайными таймерами отсрочки, были проанализированы стохастические вероятностные пропускные способности для оптимизации.

Мне нравится подход с 3 контактами, но если 2 мастера одновременно тянут 3-ю линию в низкий уровень (что имеет низкую вероятность, но не является невозможным при большом количестве сообщений), они не увидят, что происходит коллизия. Может быть, мы можем подключить линию к низкому уровню через резистор и измерить уровень сигнала: например: VCC/2 => 1 мастер хочет говорить, VCC/4: 2 мастера хотят говорить... Как только 2 или более мастеров обнаруживаются во время связи, отправка сообщения считается неудачной, и через случайное время выполняется повторная попытка. Неудобство этого подхода заключается в том, что на микроконтроллере требуется 2 контакта: один для подтягивания линии к низкому уровню, а другой для выборки аналогового уровня линии.