4.UART
Это один из самых распространенных интерфейсов. Устроен он предельно просто: биты передаются по одному с равными, заранее заданными интервалами. Признаком начала передачи является стартовый бит — переход из “пассивного” уровня (лог.1) в “активный” (лог.0). После него идут 8 бит данных начиная с младшего. Далее может идти, а может и не идти бит четности, служащий для контроля целостности байта, и наконец, несколько (даже не всегда целое число) стоп-битов. Стоп-бит является переходом от состояния предыдущего бита к “пассивному” уровню. Передача осуществляется по линии TX, прием по линии RX и могут идти одновременно. Поэтому UART — трехпроводная линия: TX, RX и земля. Линия TX одного устройства соединяется с RX второго и наоборот. Нельзя соединять TX с TX. Соединять RX с RX можно, но бесполезно. Поскольку точность обмена целиком зависит от временных интервалов, требуется хорошее согласование частот передатчика и приемника. По-хорошему, тактирование от кварцевого резонатора, но практика показывает, что и у обычного RC-генератора, используемого по умолчанию контроллером, хватает для отладочных целей. Кроме того, существует ряд стандартных скоростей обмена вроде 9600 или 115200 бит в секунду. В случае Linux, посмотреть их можно в документации на termios.


Сам по себе UART обозначает только способ передачи данных и тайминги, но не уровни сигналов или разъемы. Это позволяет разводить линии UART непосредственно на плате для соединения периферии и использовать уровни, совпадающие с напряжением питания. Для GD32VF103 логическому 0 будет соответствовать 0 В, а логической 1 — +3.3 В.
Существует и вариация UART, предназначенная для соединения отдельных приборов — RS232, она же COM-порт. Отличие в логических уровнях (лог.0 = +5…+15 В, лог.1 = -5…-15 В), стандартном разъеме (DB9 или DB25) и наличии дополнительных управляющих выводов вроде готовности передатчика или наличия тонового сигнала.
Обозначение UART или USART говорит, что данный интерфейс может работать и в синхронном режиме. Правда, используется это довольно редко. Лично мне привычнее называть его именно UART, не вспоминая о синхронных возможностях.
4.1. Программирование UART
Как и в случае любой периферии, перед использованием на нее надо подать тактовый сигнал. В случае USART0 за нее отвечает бит RCU_APB2ENR_USART0EN. Кроме того, поскольку UART задействует ноги ввода-вывода для своей работы, их необходимо настроить так, чтобы значение GPIOx_OCTL ей не мешало. Этот режим называется Alternate-function и кодируется битами 0b1011. Впрочем, ножка входа (RX) используется только для чтения и с OCTL не конфликтует, поэтому ее оставляют в режиме Input. Также работу альтернативных функций необходимо разрешить выставлением бита RCU_APB2ENR_AFEN.
После этого настраивается режим работы модуля. Настройка заключается в разрешении работы модуля (бит USART_CTL0_UEN), разрешении передачи (бит USART_CTL0_TEN) и приема (бит USART_CTL0_REN). После этого выставляется скорость обмена. Она определяется регистром USART_BAUD, который содержит делитель тактовой частоты (на самом деле, частоты шины APB2, поскольку частота на разных шинах может отличаться). В документации приведена страшная формула, содержащая целую и дробную части этого делителя, но на практике достаточно записать туда просто частное от деления тактовой частоты на скорость обмена. После этого в регистр USART_DATA можно записывать байт для передачи. В этот же регистр попадет байт, принятый с другой стороны.
Скорость UART мы выставили в 9600 бод, тогда как скорость ядра составляет 8 МГц. Поэтому нельзя записывать в USART_DATA байты на максимальной скорости — надо дожидаться пока модуль очередной байт передаст. За это отвечает бит USART_STAT_TBE. Аналогично за прием байта отвечает бит USART_STAT_RBNE, который надо проверять чтобы определить был ли принят хоть один байт.
- Разрешить тактирование UART и AF: биты RCU_APB2ENR_USART0EN и RCU_APB2ENR_AFEN.
- Настроить выводы RX, TX на вход и альтернативный выход соответственно.
- Разрешить работу UART, передатчика и приемника: биты USART_CTL0_UEN, USART_CTL0_TEN и USART_CTL0_REN.
- Настроить скорость обмена: USART_BAUD как делитель тактовой частоты
- Передача:
- Дождаться бита USART_STAT_TBE
- Записать новый байт в USART_DATA
- Дождаться бита USART_STAT_RBNE
- Считать принятый байт из USART_DATA
4.2. Отладка при помощи UART
Самый простой способ отладки: на компьютере запускается screen или другая утилита для просмотра и передачи файлов через COM-порт, для нее указывается имя порта (обычно что-то вроде /dev/ttyUSB0) и скорость обмена (та же, что выставлена на устройстве). Далее компьютер и контроллер могут обмениваться обычными текстовыми строками. Удобно функции приема и передачи строк оформить в виде подпрограмм. Еще удобнее организовать буфер-очередь (FIFO), в который из основного кода писать (читать), а по прерываниям UART передавать данные через собственно интерфейс.
При использовании screen стоит помнить, что выйти из него не проще, чем из vim’а. Сначала нужно нажать ctrl+a, потом отпустить, и нажать k. Он выдаст запрос подтверждения выхода, и там надо нажать y. Еще раз: нажали ctrl, нажали a, отпустили a и ctrl, нажали k, отпустили k, нажали y, отпустили y. Подобным способом в screen вводятся и другие команды: переключение окон, разделение по вертикали и горизонтали и т.д. Очень удобно при подключении к удаленному компьютеру, когда доступ есть только по ssh.
Протокол передачи данных UART
Универсальный асинхронный приёмопередатчик

Предисловие
Современная цифровая электроника — это всегда соединения между цепями (процессорами, контроллерами и т.д.) для создания симбиотической системы. Для того, чтобы отдельные микросхемы могли бы «понимать» друг друга, они должны разделять некий общий протокол связи. За годы существования цифровой техники было разработано множество протоколов. В целом, их все можно разделить на две большие группы — параллельные и последовательные.
Параллельный или последовательный?
Параллельные интерфейсы передают одновременно (параллельно) несколько бит информации (отсюда, собственно и их название). Для передачи данных такие интерфейсы требуют наличия шин, состоящих из 8, 16 или более проводников.

Схема параллельного 8-разрядного интерфейса. Передача данных управляется тактирующим сигналом CLK. Байт данных передается по каждому импульсу CLK . Используется 10 проводов.
В противоположность параллельным, последовательные интерфейсы передают по одному биту за раз. Теоретически такой интерфейс может работать на одном единственном проводе. На практике используется до четырех.

Пример последовательного интерфейса, передающего один бит в течение каждого тактового импульса CLK. Требуется всего 2 провода.
Эти два интерфейса можно сравнить с потоком автомобилей. Параллельный интерфейс — это широкое шоссе с количеством полос движения более восьми, а последовательный интерфейс больше поход на двухполосную сельскую дорогу. Мега — Шоссе, потенциально, имеет бОльшую пропускную способность, но очень дорого с точки зрения строительства. Сельская дорога просто выполняет свою функцию и стоит во много раз дешевле многополосного мега-шоссе.
Вне всякого сомнения, параллельные интерфейсы имеют свои преимущества. Это прямота, быстрота, и легкость реализации. Но мы получаем это за счет большого количества проводов (линий) передачи данных. Если вам когда либо приходилось разрабатывать программы для микроконтроллеров (например в среде Arduino), вы наверняка знаете, насколько драгоценными могут быть линии ввода/вывода. Поэтому мы часто останавливаем свой выбор именно на последовательной связи, жертвуя скоростью, но экономя драгоценные порты микроконтроллера.
Асинхронный последовательный интерфейс
За время существования цифровой техники были созданы десятки последовательных протоколов. USB (универсальная Последовательная Шина) и Ethernet — это пример двух наиболее популярных сейчас последовательных протоколов. Другие очень популярные последовательные интерфейсы — это SPI, I2C и последовательный интерфейс, о котором пойдет речь в этой статье. Каждый их этих интерфейсов можно отнести к одной из двух подгрупп — Асинхронные и Синхронные.
Синхронный протокол всегда включает линию тактового сигнала. Это обеспечивает более простую (и зачастую более быструю) передачу данных, но требует как минимум один дополнительный провод. Пример синхронных интерфейсов — это SPI и I2C.
Асинхронный интерфейс подразумевает , что данные передаются без поддержки внешнего тактового сигнала.Этот метод передачи идеально подходит для минимизации количества проводов, но это означает, но для надежной передачи и приема данных рнужно приложить дополнительные усилия. Последовательный интерфейс, который мы обсудим в этой статье, является наиболее распространенным и старым асинхронным и протоколом. Часто бывает так, что, когда человек говорит «последовательный», он имеет в виду именно этот протокол.
Асинхронный последовательный интерфейс, о котором здесь идет речь, широко используется во встраиваемых системах. Если вы хотите добавить в свой проект модуль GPS, Bluetooth, XBee, последовательные ЖК-дисплеи или многие другие внешние устройства, вам, вероятно, придется столкнуться с одним из последовательных интерфейсов.
Правила последовательного интерфейса.
Асинхронный последовательный протокол имеет ряд встроенных правил — механизмов, которые помогают обеспечить надежную и безошибочную передачу данных. Это те механизмы, которые позволяют передавать данные без использования внешнего тактового сигнала:- Биты данных
- Биты синхронизации
- Биты проверки четности
- Скорость передачи
Благодаря сочетанию этих правил — параметров, протокол очень гибкий. Для успешной связи нужно убедиться, что оба устройства на шине настроены на использование одинаковых правил.
Скорость передачи
Данный параметр определяет скорость передачи данных по последовательной линии. Обычно это выражается в единицах бит в секунду (бит / с или БОД). Если вы инвертируете этот параметр, выраженный в бодах, то получите время, которое требуется для передачи одного бита. Это значение определяет, как долго передатчик держит последовательную линию в высоком / низком состоянии или в какой период принимающее устройство производит выборку своей линии.
Скорость передачи может быть практически любой в пределах разумного. Единственное требование заключается в том, что оба устройства работали с одинаковой скоростью. Одна из наиболее распространенных скоростей передачи, особенно для простых применений, где скорость не критична, составляет 9600 бит / с. Другие «стандартные» скорости — 1200, 2400, 4800, 19200, 38400, 57600 и 115200.
Чем выше скорость передачи в бодах, тем быстрее осуществляется передача и прием данных. Но для максимальной скорости существуют физические ограничения . Обычно на практике вы не увидите скоростей, превышающих 115200. Для большинства микроконтроллеров это максимальная скорость. Если выбрать слишком высокую скорость, то неизбежно появятся ошибки на
принимающей стороне.Кадры данных
Каждый блок данных (обычно это байт) фактически отправляется в пакете или кадре битов. Кадры создаются путем добавления бит синхронизации и бит четности к битам данным.

Один кадр (Frame) последовательных данны. (Size = размер)
Давайте рассмотрим каждую часть кадра более подробно
Блок Данных ( Data chunk )
Самая важная часть каждого пакета — это блок данных, так как именно этот блок несет полезную информацию. Мы намеренно называем этот блок «куском» данных (chunk), поскольку его размер конкретно не указан. Количество данных в каждом пакете может быть установлено любым — от 5 до 9 бит. Разумеется, стандартный размер данных — это наш с вами основной 8-разрядный байт, но другие его размеры также в ходу. 7-битный блок данных может быть более эффективным, чем 8-битный, особенно если вы просто переносите 7-битные символы ASCII (текст).
После согласования длины символа оба устройства на последовательной шине также должны согласовать достоверность своих данных. Являются ли данные наиболее старшим битом (msb) наименьшим, или наоборот? Если не указано иное, обычно мы предполагаем, что сначала передается младший бит (lsb)
Биты синхронизации
Биты синхронизации представляют собой два или три специальных бита, передаваемых с каждым фрагментом данных. Это стартовый и стоповый биты. Эти биты отмечают начало и конец пакета. Всегда есть только один стартовый бит, но количество стоповых бит настраивается отдельно. Может быть один или два стоп-бита (чаще всего используется один).
Старт-бит всегда определяется линией данных по его спаду (переходу от 1 в 0), в то время как стоп биты определяются линией по фронту, то есть по переходу из 0 в 1.
Биты четности
Четность — это форма очень простой, низкоуровневой проверки ошибок. Может быть два варианта такой проверки: нечетный или четный. Чтобы создать бит четности, все 5-9 бит блока данных складываются, а четность суммы определяет, установлен бит четности или нет. Например, представим себе что у нас проверка установлена в режим четности. Байт данных в двоичном представлении равен 01011101. Видим, что в байте нечетное количество единиц (пять единиц). В этом случае бит проверки четности будет установлен в 1. Если мы настроим режим проверки на на нечетность, то соответственно, бит проверки будет установлен в 0.
Пример настройки протокола: 9600 8N1
9600 8N1 — 9600 бод, 8 бит данных, без контроля четности и 1 стоповый бит — это одна из наиболее часто используемых настроек последовательного протокола. Итак, как выглядит пакет или два из 9600 8N1 данных? Приведем пример:

Фактически для каждого байта передаваемых данных отправляются 10 бит: начальный бит, 8 бит данных и стоповый бит. Таким образом, при 9600 бит / с мы фактически отправляем 9600 бит в секунду или 960 (9600/10) байтов в секунду.
Теперь, когда вы знаете, как создавать последовательные пакеты, мы можем перейти к разделу аппаратного обеспечения.
Мы увидим, как всё это будет реализовано на уровне сигнала.Последовательная шина состоит всего из двух проводов: один для отправки данных и другой — для приема. Таким образом, последовательные устройства должны иметь два последовательных контакта: приемник, ( RX ) и передатчик ( TX ).

Важно понимать, что обозначения RX и TX относятся к самому устройству. Поэтому RX одного устройства должен соединяться с TX другого, и наоборот. Это может показаться странным, если вы привыкли подключать сигналы VCC к VCC, GND к GND, MOSI в MOSI и т.д. Но все-таки это имеет смысл, поскольку передатчик (TX ) должен разговаривать с приемником (RX) , а не с другим передатчиком.
Последовательный интерфейс, в котором оба устройства могут отправлять и принимать данные, называется дуплексным или полудуплексным. Дуплексный означает, что оба устройства могут отправлять и принимать одновременно. Полудуплексная связь означает, что последовательные устройства должны по очереди отправлять и принимать данные.
Реализация в железе
Итак, мы с вами рассмотрели асинхронный последовательный протокол с концептуальной стороны. Мы знаем, какие провода нам нужны. Но как осуществляется последовательная связь на уровне сигнала? На самом деле, по-разному. Существуют всевозможные стандарты. Давайте рассмотрим пару наиболее популярных аппаратных реализаций последовательного интерфейса: логического уровня (TTL) и RS-232.
Когда микроконтроллеры и другие низкоуровневые ИС взаимодействуют между собой по последовательному протоколу, они обычно делают это на уровне TTL (транзисторно- транзисторная логика). Последовательные сигналы TTL живут между диапазоном напряжения питания микроконтроллера — обычно от 0 до 3,3 В или 5 В. Сигнал на уровне VCC (3,3 В, 5 В и т. д.) указывает либо о простое, либо это — бит 1 данных, либо стоп-бит. Сигнал 0 В (GND) представляет собой либо стартовый бит, либо бит данных значения 0.

Интерфейс RS-232, который можно найти на некоторых более старых компьютерах и периферийных устройствах, похож на обычный последовательный TTL. У них просто разные уровни напряжения. Обычно сигналы RS-232 варьируются от -13 В до +13В, хотя спецификация позволяет все что угодно в диапазоне от +/- 3 В до +/- 25 В. Низкое напряжение (-5 В, -13 В и т. д.) указывает либо холостой ход, либо стоп-бит, либо бит данных значения 1. Высокий сигнал RS-232 означает либо стартовый бит, либо 0-бит данных. В полярности сигналов как раз кроется противоположность последовательному TTL.

Во встроенных схемах (внутри одного устройства) намного проще использовать последовательные сигналы формата TTL. Но в случае с длинными линиями передачи данных низкие уровни TTL намного более восприимчивы к потерям и помехам. RS-232 или более сложные стандарты, такие как RS-485, лучше подходят для последовательных передач на большие расстояния.
Когда вы соединяете два последовательных устройства вместе, важно убедиться, что их сигнальные напряжения совпадают. Вы не можете напрямую соединять последовательное устройство TTL с шиной RS-232. Вам придется конвертировать их уровни для взаимной совместимости.
UART
Универсальный асинхронный приемник / передатчик (UART) представляет собой блок схем, ответственный за реализацию последовательной связи. По сути, UART выступает в качестве посредника между параллельными и последовательными интерфейсами. На одном конце UART есть шина из восьми (или около того) линий данных (плюс некоторые управляющие контакты), с другой — два последовательных провода — RX и TX.

Упрощенная схема интерфейса UART
Интерфейсы UART существуют в виде отдельных микросхем, но чаще всего они встроены в микроконтроллеры. Чтобы узнать, есть ли у вашего МК протокол UART, вам придется почитать даташит на этот контроллер. У некоторых нет ни одного, у некоторых есть, у некоторых их несколько. Например, Arduino Uno, основанный на старом добром ATmega328, имеет только один UART, в то время как Arduino Mega — построенный на ATmega2560 — имеет целых четыре UART.
R и T в терминологии UART несут ответственность за отправку и получение последовательных данных. На стороне передачи UART должен создать пакет данных — добавление битов синхронизации и четности — и отправить этот пакет по линии TX в соответствии с установленной скоростью передачи. На стороне приема UART должен проверять линию RX со скоростью, соответствующей ожидаемой скорости передачи в бодах, выбирать биты синхронизации и выделять данные.

Внутренняя блок-схема UART (любезно предоставлена Exar ST16C550)
Более продвинутые UART могут передавать полученные данные в буфер, где они будут оставаться до тех пор, пока микроконтроллер не сможет их получить и обработать. Обычно UART выдают буферизованные данные по принципу «первым вошел — первым вышел» (FIFO). Буферы могут быть как маленькими, так и большими, более тысячи байтов.
Программный UART
Если микроконтроллер не имеет встроенного аппаратного UART (или их количество недостаточно для приложения), последовательный интерфейс может быть реализован программно. Это тот подход, который используется в библиотеках Arduino, таких, как SoftwareSerial.Точность работы программно реализуемого UART меньше чем аппаратного, но в крайнем случае можно использовать и такой вариант.
Общие вопросы
Это все, что связано с последовательной связью. Я хотел бы обратить ваше внимание на распространенные ошибки, которые допускают инженеры любого уровня опыта. Это досадные ошибки вроде RX-to-TX, TX-to-RX. Удивительно, но это ошибка, которую я допускал несколько раз.
Несоответствие скорости передачи
Скорость передачи данных — это вроде языка в последовательной связи. Если два устройства не «говорят» с одинаковой скоростью, данные могут быть либо неверно истолкованы, либо полностью пропущены. Если все принимающее устройство «видит» на своей линии приема гору мусора, проверьте соответствие скоростей передачи и приема.

Данные передавались со скоростью 9600 бит/с, но получены со скоростью 19200 бит/с. В итоге — гора мусора.
Объединение шин
Последовательная связь предназначена для того, чтобы два устройства могли обмениваться данными по одной последовательной шине. Если несколько устройств пытаются передать на одной и той же последовательной линии, вы можете столкнуться с конкуренцией на шинах.
Например, если вы подключаете GPS-модуль своего Arduino, вы можете просто подключить TX-линию этого модуля к линии RX Arduino. Но этот вывод Arduino RX уже подключен к контакту TX преобразователя USB-to-serial, который используется всякий раз, когда вы программируете Arduino или используете Serial Monitor. Это порождает возможность возникновения ситуации, когда и модуль GPS, и чип FTDI попытаются передать данные на одной и той же шине одновременно.

Два передатчика пытаются отправить данные в одну и ту же шину. Ситуация конкуренции на шине
В общем, нужно придерживаться правила — одна последовательная шина, два последовательных устройства!
Protocol: UART — Universal Asynchronous Receiver / Transmitter

The first communication protocol embedded systems enthusiasts should perfect.
* Disclaimer — This blog post is written not to teach or understand the workings of UART of different microcontrollers or embedded IC’s. The main aim of this article is to point out the various use cases of UART communication and to help understand its limitations and the learning that it provides to developers who have used it.
Many a times users of our Bolt IoT platform want to interface a wide range of sensors with the development board , but are not able to do so as a few sensor require communication protocols which Bolt does not provide. For example DHT11 temperature and humidity sensor. A simple work-around for this is interfacing the sensors first with an Arduino board and then communicating the sensor data from the Arduino to Bolt so that it can be uploaded to the Bolt cloud for further processing. This communication between the two boards is made feasible by the use of the UART.
Uses Cases: Why UART is one of the most important protocols for product developers and makers alike.
Let’s list a few projects and see the peripherals that are required for the same, which use UART:
1) GSM / GPS modules like SIM900/800 uses UART communication for accepting AT commands that are used to control them and gather the replies. Example: In regions where WiFi is not available we had to interface Bolt with a GSM unit for global monitoring and control.
2) Identification projects that use RFID modules can be built with modules that have an UART interface. This even applies to some Finger Print sensors.
3) To communicate between a microcontroller and your PC (desktop/laptop) we generally use a USB to UART converter for communication, which converts USB communication to UART message from the PC to the microcontroller and vice versa.
4) Apart from the above many ICs also act converters from many standard peripheral communications protocols like SPI and I2C to UART, thus even those peripherals that do not have an onboard UART can still use it.
5) Even for long range wired communications we can convert UART protocol using an external IC to RS232 or RS485, the latter of which can be used for wired communication @100 kbits/s up to 1.2 Km.
Now I would like to elaborate on a few terms closely associated with the use of the UART.
Asynchronous : Now as clear as this term may seem to most with a well versed vocabulary, with respect to UART it means that the two microcontrollers or the microcontroller and its peripheral involved in communicating over this protocol, need not be working at the same clock frequency.
For example, let us say we have microcontroller-A(μA) which is running at 80Mhz frequency (e.g.ESP8266 used on Bolt IoT) which needs to communicate microcontroller-B(μA) which itself is running at 16 Mhz (Atmel controllers used for Arduino boards). This creates a clear problem in communications which is, if μA sends data to μB (when both are transmitting and receiving at full speed) since the speed of reading of μB is around 1/40th the speed of μA that means by the time μA has sent all its data μB will have read only approximately 2% of sent data. The reverse case μA will have stopped reading much before μB can even finish transmitting all the data it needs to send.
UART communication tackles this issue by ensuring both parties involved agree upon a pre-defined rate to transmit and receive data, which is termed as the Baud rate.
Baud rate: Often there is a confusion involved with this term, and before we proceed I would like to clear that out for few of the readers who may still have it.
To explain this lets say μA is sending 8bits of data to μB. It takes x amount of time to transmit all of the bits to μB.
This means every bit is being sent to μB at the speed 8/x bits per second (bps). This is known as the bit rate involved in the communication and should not be confused with the term baud rate.
Baud rate, is the rate at which the binary bits of data being communicated are supposed to change i.e. undergo a transition from 1 to 0 or 0 to 1. When both microcontrollers know the baud rate at which data is being communicated at, they can sample the voltage present on the communication wire at the rate of 1/(baud rate) per second and determine whether the data bit is 1 (if sampled voltage is 5v) and 0 (if sampled voltage is at Ground or 0V) *Assuming TTL logic.
Hence if the baud rate is 1, only one bit of data will be sampled and read per second. Even if the μA has sent 8bits to μB in one second, μB will only sample the voltage once in that duration and whichever voltage value it comes across at the time of sampling will be read as a valid single bit of data.
So now lets me explain in brief how the UART protocol uses the baud rate to tackle the issue of Asynchronous communication.
Now consider the most commonly used baud rate i.e. 9600. This means that the data can sampled at the speed of 9600 samples per second in other words the data stream can undergo 9600 transitions between 0 and 1 per second. This thus implies that effectively 9600 data bits can be read per second and 9600 data bits can be transmitted per second. This tells us by agreeing upon the Baud rate beforehand we are also setting the maximum bit rate for communication.
Error Rate : This is calculated based on the Baud rate agreed upon and Baud rate that the microcontroller or peripheral can actually be set at due to internal hardware limitations. The formula for the same is (calculated in percentage)
Error% = ((Actual_baud/Baud_desired) — 1) * 100%
Example : We want a baud rate of 2400 but the microcontroller practically can only give an accurate baud rate of 2396 , we get.
Error% = ((2396 / 2400) — 1) * 100%
UART Working (In brief):
Before two devices can communicate using this protocol they must
1) Agree upon a pre-determined baud rate at which the communication will take place at.
2) Ensure that the bit transitions adhere to this rate.
3) Have two dedicated lines(wires/pins) for Transmission and reception
a. UART protocol is designed to be an effective full duplex communication, i.e. each device is capable to transmit and receive simultaneously.
4) Make sure the communication error rate is less than +/- 2%.
a. For Atmel ATMega series of controllers there is a quick reference guide for error rate and oscillator frequency at http://wormfood.net/avrbaudcalc.php
5) For UART communication we use a null modem or cross over cable which simply means that the Rx(Receive pin) of μA is connected to Tx(Transmit pin) of μB and Tx pin of μA is connected to Rx pin of μB.
a. Note Having a common ground is important for all types of wired communication between 2 or more microcontrollers and its peripherals.
Now once all the five points above are covered the UART communication can take place. Few additional details like data packet size , start bit and stop bits, and for error handling the use of parity bit can all be understood by referring to the following link.
Learning: As you begin to use the UART for communication you will face many issues, debugging these will largely improve your coding sense and logic ability.
1) Code timings and delays:
a. UART communication being asynchronous, your code logic must incorporate a communication flow that should
i. Not block other segments of running code
ii. Make sure that incoming bytes are being read before the FIFO buffer at the dispose of the receiver becomes full, this will cause loss of data.
b. This forces the user to choose between reading on the fly i.e. the main loop of your is dedicated to reading the UART and other code runs based on preset delays after reading is done or
c. Reading the UART in an interrupt based subroutine which is triggered if the Receiver Buffer has received a Byte or
d. Reading the UART in an interrupt based subroutine which is triggered after the Transmitter has sent a command to the peripheral and needs to wait for the reply before further execution.
2) Using GPIOs for handshaking.
a. This implies that sometimes some peripheral may want to request data without sending data itself, in which case it may change the state of a predetermined IO pin indicating the request.
b. Or the peripheral wants to send data and the master needs to be interrupted / made aware of the communication by changing the state of the IO pin.
c. The same logic can be further extended as a way of telling each other that
i. Communication was received and has been processed
ii. Indicate that the device is ready for the communication to start
iii. Communication cannot currently take place
3) Apart from above two , you will face many more issues during communication which may just seem mind boggling in the beginning , but the solutions to which you will later realise are sometimes just a question of adding one line of delay statement in your code. This process will definitely sharpen your debugging skills.
So finally we’ll look at the limitations UART protocol has.
1) Large chunks of data which need to transferred at a very high rate (bps) sometimes face limitations when using UART depending on various factors such as the clock frequency of the microcontroller.
2) For high speeds the wires used for communication also need to be very short otherwise there are high chances of signal corruption due to noise.
3) Error handling is only limited to addition of parity bit.
4) Its recommended of staying within a limit of 2% error rate.
In conclusion, UART is a very easy to start off with communication protocol and is designed for simplicity. Learning it will build a solid base before moving on to coding for other protocols like SPI and I2C.
Связь UART: основа последовательной передачи данных
В области связи и передачи данных UART (универсальный асинхронный приемник/передатчик) считается одним из основных протоколов для облегчения последовательной передачи данных между устройствами. Он играет жизненно важную роль в обеспечении бесперебойной связи между различными компонентами, микроконтроллерами и системами в широком диапазоне приложений.
В этой статье мы углубимся в тонкости связи UART, изучая принципы ее работы, преимущества и недостатки, приложения и будущее этого важного протокола связи.

Введение в связь UART
UART, сокращение от Universal Asynchronous Receiver/Transmitter, представляет собой широко распространенный протокол последовательной связи, используемый для передачи данных между электронными устройствами. Это был основной метод связи в электронной промышленности на протяжении десятилетий, позволяющий устройствам обмениваться информацией без необходимости использования общего тактового сигнала. Вместо этого UART использует стартовые и стоповые биты для кадрирования передаваемых данных, позволяя устройствам синхронизироваться во время связи.
Простота и универсальность UART сделали его популярным выбором в различных приложениях, от промышленной автоматизации и встроенных систем до беспроводной связи и устройств Интернета вещей (IoT). Несмотря на появление более сложных протоколов связи, UART продолжает оставаться неотъемлемой частью современной электроники благодаря своей отказоустойчивости и простоте реализации.
Как работает связь UART
По своей сути связь UART включает два основных компонента: передатчик (Tx) и приемник (Rx). Передатчик преобразует параллельные данные в поток последовательных данных, а приемник преобразует поток последовательных данных обратно в параллельные данные для обработки принимающим устройством.
Стартовые и стоповые биты Связь UART использует стартовые и стоповые биты вместе с кадром данных для обеспечения надежной передачи данных. Кадр данных обычно состоит из начального бита, битов данных (обычно 8 бит), необязательного бита четности для проверки ошибок и одного или нескольких стоповых битов.
Во время передачи данных стартовый бит сигнализирует о начале кадра данных, и приемник синхронизируется с этим сигналом. Биты данных несут фактическую информацию, которая должна быть передана, а необязательный бит четности помогает в обнаружении ошибок. Наконец, стоповый бит или биты сигнализируют об окончании кадра данных.
Асинхронная операция Одной из определяющих особенностей связи UART является ее асинхронный характер. В отличие от протоколов синхронной связи, UART не использует общий тактовый сигнал между отправителем и получателем. Вместо этого каждый фрейм данных является автономным со своими стартовыми и стоповыми битами, что позволяет UART работать эффективно, даже если устройства имеют разные тактовые частоты.
Скорость передачи данных и синхронизация Для обеспечения точной передачи данных и передатчик, и приемник должны быть настроены на одинаковую скорость передачи данных. Скорость передачи относится к количеству битов, передаваемых в секунду. Синхронизируя скорость передачи данных, устройства могут точно интерпретировать отправляемые и получаемые данные.
Регулировка скорости передачи данных позволяет использовать различные скорости передачи данных, при этом более высокие скорости передачи данных обеспечивают более быструю связь. Однако важно найти баланс между скоростью и надежностью, так как более высокие скорости передачи данных могут привести к ошибкам на больших расстояниях или в шумной среде.
Преимущества связи UART
Эта связь предлагает несколько преимуществ, что делает ее предпочтительным выбором для различных приложений:
Простота: протокол UART относительно прост в реализации, что делает его совместимым с широким спектром микроконтроллеров и устройств. Его простая структура позволяет легко интегрироваться в электронные системы.
Гибкость: UART можно использовать как в двухточечной, так и в многоточечной конфигурации, что обеспечивает гибкие соединения между устройствами. Будь то связь «один к одному» или установка связи «один ко многим», UART может работать с различными сетевыми топологиями.
Низкие накладные расходы: сам протокол имеет минимальные накладные расходы, а это означает, что кадр данных содержит относительно небольшое количество битов помимо фактических данных. Такая эффективность делает UART идеальным выбором для приложений с ограниченной пропускной способностью или вычислительной мощностью.
Асинхронная операция: Отсутствие общих часов позволяет эффективно работать UART в ситуациях, когда устройства работают на разных тактовых частотах. Это упрощает конструкцию оборудования и устраняет необходимость точной синхронизации часов между устройствами.
Недостатки протокола
Хотя связь UART предлагает множество преимуществ, она также имеет некоторые ограничения:
Короткие расстояния передачи: связь UART подходит для относительно коротких расстояний из-за ухудшения сигнала при передаче по длинным кабелям. По мере увеличения расстояния передачи возрастает риск ошибок данных, что делает UART менее подходящим для связи на большие расстояния.
Ограниченная проверка ошибок: Хотя необязательные биты четности помогают обнаруживать ошибки, в UART отсутствуют расширенные механизмы исправления ошибок, присутствующие в других протоколах. В результате это может быть не лучшим выбором для приложений, требующих высокой целостности и надежности данных.
UART против других протоколов связи
Хотя UART является широко используемым протоколом связи, важно понимать, чем он отличается от других распространенных протоколов в электронной промышленности:
UART и CAN-шина (локальная сеть контроллеров):
сравнение UART CAN шины Тип связи Асинхронный Асинхронный Топология Точка-точка или несколько точек Мультимастер Линии данных 2 (передача и прием) 2 (CANH и CANL) Скорость передачи данных От умеренного до высокого От умеренного до высокого Обнаружение ошибок Ограниченный Расширенный (CRC, ACK) Исправление ошибок Ограниченный Расширенный (ARQ, повторная передача) Область применения Общее назначение Автомобильная промышленность, Промышленность CAN-шина и UART служат для разных целей при обмене данными. CAN шины предназначен для надежной и надежной связи в сложных автомобильных и промышленных приложениях, где несколько узлов должны беспрепятственно взаимодействовать друг с другом. Он поддерживает связь с несколькими мастерами и предлагает механизмы обнаружения и исправления ошибок, что делает его идеальным для критически важных систем. С другой стороны, UART проще и больше подходит для связи общего назначения между двумя устройствами без сложности сети.
Несмотря на преимущества других протоколов связи, UART остается популярным выбором во многих сценариях благодаря своей простоте, легкости реализации и широкой совместимости с различными устройствами и микроконтроллерами.
UART против SPI (последовательный периферийный интерфейс):
сравнение UART SPI Тип связи Асинхронный Синхронный Топология Точка-точка или несколько точек Точка-точка Линии данных 2 (передача и прием) 4 (МОСИ, МИСО, СКЛК, КС/СС) Скорость передачи данных От умеренного до высокого High Обнаружение ошибок Ограниченный Нет Исправление ошибок Ограниченный Нет Область применения Общее назначение Высокоскоростная и ближняя И UART, и SPI являются протоколами последовательной связи, используемыми для обмена данными между устройствами. Однако UART является асинхронным и поддерживает многоточечную связь, а SPI является синхронным и обычно используется для двухточечной связи. SPI обеспечивает более высокую скорость передачи данных и более точную синхронизацию часов, но требует дополнительных сигнальных линий.
UART против I2C (межинтегральная схема):
сравнение UART I2C Тип связи Асинхронный Синхронный Топология Точка-точка или несколько точек Мультимастер Линии данных 2 (передача и прием) 2 (ПДД и СКЛ) Скорость передачи данных От умеренного до высокого Умеренная Обнаружение ошибок Ограниченный Нет Исправление ошибок Ограниченный Нет Область применения Общее назначение Низкая скорость и малая дальность UART и I2C являются широко используемыми протоколами последовательной связи. I2C известен своими высокоскоростными возможностями работы с несколькими ведущими и подчиненными устройствами, что делает его подходящим для связи между несколькими устройствами на одной шине. Напротив, UART лучше подходит для связи «точка-точка» или «точка-многоточка» благодаря своей асинхронности и простоте.
UART против Ethernet
сравнение UART Ethernet Тип связи Асинхронный Пакетный Топология Точка-точка или несколько точек Зависит от конфигурации Линии данных 2 (передача и прием) Зависит от конфигурации Скорость передачи данных От умеренного до высокого High Обнаружение ошибок Ограниченный Нет Исправление ошибок Ограниченный Нет Область применения Общее назначение Локальные сети (LAN) Приложения связи UART
Связь UART находит широкое применение во многих приложениях в различных отраслях:
Легкие электромобили (LEV): Связь UART находит применение в легких электромобилях типа «точка-точка», таких как электрические скутеры, электровелосипеды и ховерборды. Эти LEV часто используют интерфейсы UART для облегчения обмена данными между контроллером двигателя, системой управления батареями и пользовательским интерфейсом. Связь UART позволяет в режиме реального времени контролировать состояние батареи, производительность двигателя и действия пользователя, обеспечивая оптимальный контроль и эффективность решений для электромобильности.
В LEV связь UART помогает реализовать функции безопасности, такие как управление рекуперативным торможением и механизмы защиты аккумулятора. Он обеспечивает плавную координацию между контроллером мотора и системой управления батареями, оптимизируя подачу питания и продлевая срок службы батареи.
Кроме того, низкие накладные расходы и простота UART делают его эффективным выбором для маломощных LEV, где эффективность использования ресурсов и скорость отклика в реальном времени являются критическими факторами. Поскольку спрос на экологически чистые и компактные транспортные решения продолжает расти, связь UART играет жизненно важную роль в повышении производительности и безопасности легких электромобилей.
Робототехника и автоматизация: В робототехнике и автоматизации связь UART играет решающую роль в обеспечении точной и своевременной связи между различными компонентами. Роботы, автоматизированные системы и автономные транспортные средства полагаются на UART для обмена командами управления, данными датчиков и информацией о состоянии системы, обеспечивая скоординированную и эффективную работу.
Беспроводная связь: UART используется в беспроводных модулях для беспроводной передачи данных между устройствами. Это приложение обычно используется для связи Bluetooth и Wi-Fi, где оно обеспечивает беспрепятственный обмен данными между мобильными устройствами и периферийными устройствами.
Последовательная отладка и программирование: На этапах разработки и тестирования микроконтроллеров и встроенных систем UART играет жизненно важную роль в последовательной отладке и программировании. Разработчики подключают интерфейс UART к компьютеру или терминалу для получения отладочной информации, доступа к внутреннему состоянию системы и выполнения обновлений прошивки. Этот процесс отладки помогает выявлять и устранять проблемы, обеспечивая надежность и функциональность электронных систем.
Связь GSM/GPS: Интерфейсы UART используются для связи с модулями GSM и GPS в различных системах слежения и связи. Модули с поддержкой UART отправляют данные о местоположении, позволяя устройствам отслеживать положение транспортных средств, имущества и людей.
Индустриальная автоматизация: связь UART используется в системах промышленной автоматизации для обмена данными между датчиками, контроллерами и другим оборудованием. Это облегчает мониторинг и управление в режиме реального времени, повышая эффективность и точность промышленных процессов.
Медицинские приборы и системы здравоохранения: UART используется в различных медицинских устройствах, включая мониторы пациента, диагностическое оборудование и медицинские датчики. Он позволяет передавать важные данные медицинским работникам или централизованным системам здравоохранения, способствуя своевременной и точной медицинской диагностике и вмешательству.
Встроенные системы: Многие встроенные системы используют UART для обеспечения связи между различными компонентами системы. UART позволяет встроенным устройствам передавать данные на внешние периферийные устройства, облегчая взаимодействие с датчиками, дисплеями и другими электронными компонентами.
Устройства Интернета вещей (IoT): По мере того, как устройства IoT становятся все более распространенными, UART играет важную роль в подключении этих устройств к Интернету или другой сетевой инфраструктуре. Микроконтроллеры с поддержкой UART обеспечивают беспрепятственный обмен данными, позволяя устройствам IoT передавать данные в облачные службы или другие подключенные устройства.
Можно ли заменить UART?
Давайте рассмотрим возможности замены UART и факторы, которые следует учитывать:
1. Требования к заявке: Решение о замене UART зависит прежде всего от конкретных требований приложения. Простота UART и низкие накладные расходы делают его подходящим для многих приложений, особенно с более низкой скоростью передачи данных и относительно короткими расстояниями. Однако, если приложение требует более высокой скорости передачи данных, меньшей задержки или более надежных механизмов проверки и исправления ошибок, разработчики могут рассмотреть альтернативные протоколы.
2. Высокоскоростная связь: Для приложений, требующих высокоскоростной передачи данных, асинхронный характер UART может стать ограничивающим фактором. В таких случаях разработчики часто обращаются к таким протоколам, как последовательный периферийный интерфейс (SPI) или межинтегральная схема (I2C), которые обеспечивают синхронную связь и более высокие скорости передачи данных. Эти протоколы лучше подходят для связи на короткие расстояния между несколькими устройствами на одной шине.
3. Синхронная связь: В отличие от асинхронной работы UART, некоторые приложения требуют точной синхронизации между устройствами. Например, системы, обрабатывающие данные в режиме реального времени или управление с обратной связью, могут выиграть от таких протоколов, как сеть контроллеров (CAN) или Ethernet, где точная синхронизация и синхронизация имеют решающее значение для успешной работы.
4. Обнаружение и исправление ошибок: Механизмы обнаружения и исправления ошибок UART ограничены необязательными битами четности. Если приложению требуется более надежная обработка ошибок, такие протоколы, как CAN, USB или Ethernet, обеспечивают расширенные функции проверки ошибок, повышая целостность и надежность данных.
5. Связь с несколькими мастерами: В сценариях, когда несколько устройств должны выступать в качестве ведущих на коммуникационной шине, конфигурация UART с одним ведущим устройством может оказаться неадекватной. Такие протоколы, как I2C и CAN, обеспечивают связь с несколькими ведущими, обеспечивая более гибкую и масштабируемую топологию сети.
6. Междугородная связь: Для приложений, требующих дальней связи, ухудшение сигнала UART по удлиненным кабелям может представлять проблему. В таких случаях такие протоколы, как RS-485 или CAN с соответствующими трансиверами, могут быть более подходящими из-за их надежности и способности поддерживать целостность сигнала на больших расстояниях.
7. Беспроводная связь: При работе с беспроводной связью UART может быть не самым эффективным выбором. Беспроводные протоколы, такие как Bluetooth, Wi-Fi, Zigbee или LoRaWAN, обеспечивают лучшую интеграцию с беспроводными модулями и обеспечивают более широкий диапазон и более высокую скорость передачи данных для беспроводных приложений.
8. Сложные сетевые топологии: В сценариях, где сложная сеть устройств должна беспрепятственно обмениваться данными, часто предпочтительны протоколы полевой шины, такие как CAN или Ethernet. Эти протоколы предлагают четко определенные стандарты связи, что делает их подходящими для крупномасштабной промышленной автоматизации, автомобильных систем и сетевых приложений.
Будущее связи UART
Поскольку технология продолжает развиваться, актуальность связи UART сохраняется, особенно в задачах связи низкого уровня и встроенных системах. В то время как более сложные протоколы, такие как Ethernet, USB и беспроводные технологии, доминируют в высокоскоростной и дальней связи, простота и эффективность UART делают его важным компонентом различных электронных устройств.
Одной из областей, где ожидается, что UART будет играть значительную роль, является Интернет вещей (IoT). По мере увеличения количества взаимосвязанных устройств потребность в простой связи с низким энергопотреблением становится все более очевидной. Простая реализация UART и низкие накладные расходы делают его привлекательным выбором для устройств IoT, которым требуется эффективная передача данных и низкое энергопотребление.
Кроме того, поскольку спрос на связь с малой задержкой продолжает расти, асинхронный характер UART может обеспечить преимущество в некоторых приложениях. Для передачи данных в реальном времени асинхронные коммуникационные протоколы, такие как UART, могут превзойти синхронные протоколы, основанные на тактовой синхронизации.
Кроме того, достижения в разработке аппаратного и программного обеспечения привели к разработке более надежных систем связи на основе UART. Методы проверки и исправления ошибок могут быть интегрированы в системы на основе UART для повышения целостности и надежности данных. Комбинируя UART с соответствующими механизмами обнаружения ошибок, разработчики могут смягчить некоторые ограничения этой связи.
Кроме того, с ростом интеграции аппаратного и программного обеспечения в современные устройства UART можно использовать в сочетании с протоколами более высокого уровня для повышения эффективности связи. Например, этот протокол можно использовать в сочетании с протоколами более высокого уровня, такими как Bluetooth или Wi-Fi, для обеспечения беспроводной связи, обеспечивая преимущества простоты UART и преимущества беспроводной связи.
Заключение
Связь UART остается важнейшим и основополагающим протоколом в мире последовательной передачи данных. Его простота, универсальность и простота реализации сделали его предпочтительным выбором для различных приложений, от промышленной автоматизации до встроенных систем и устройств IoT. В то время как другие протоколы связи доминируют в высокоскоростной и междугородной связи, асинхронный характер UART и низкие накладные расходы продолжают служить важными компонентами современной электроники.
Ожидается, что по мере развития технологий UART будет адаптироваться и развиваться, находя новые приложения и расширяя свои возможности за счет интеграции механизмов обнаружения ошибок и сопряжения с протоколами более высокого уровня. В результате эта связь будет продолжать играть важную роль в обеспечении бесперебойной и эффективной передачи данных между устройствами, обеспечивая бесперебойную работу электронных систем в постоянно развивающейся цифровой эпохе.