Чем прослушать протокол uart
Перейти к содержимому

Чем прослушать протокол uart

  • автор:

UART — Универсальный Асинхронный Приёмопередатчик

Универсальный асинхронный приёмопередатчик (Univsersal Asynchronos Reciever-Transmitter) — это физическое устройство приёма и передачи данных по двум проводам. Оно позволяет двум устройствам обмениваться данными на различных скоростях. В спецификацию UART не входят аналоговые уровни на которых ведётся общение между устройствами, UART это протокол передачи единиц и нулей, электрическую спецификацию на себя берут другие стандарты, такие как TTL (transistor-transistor logic — транзисторно-транзисторная логика), RS-232, RS-422, RS-485 и другие (RS [англ.recommended standard] — рекомендованный стандарт). На данный момент в микроконтроллерах используется в основном TTL (или точнее CMOS) UART для соединения не более двух устройств. В наших примерах мы часто называем его последовательным портом.

Подключение:

У каждого устройства, поддерживающего UART обычно обозначены два вывода: RX и TX. TX — означает transmit (передаю), RX — receive (принимаю). Отсюда становится понятно что RX одного устройства нужно подключать к TX другого. Если Вы подключите RX одного устройства к RX другого, то оба устройства будут слушать друг друга, вы соединили их входы. Если соединить TX и TX — это уже более опасно, это выходы низкого сопротивления устройств и если на одном будет логическая единица, а на втором ноль — по проводу пойдёт ток короткого замыкания (это зависит от конкретной программной или аппаратной реализации). Хотя в современных чипах от этого есть защита, на всякий случай, не стоит на неё ориентироваться. Так же необходимо объединить референсные уровни двух устройств (GNDGND), если не подразумевается гальваническая развязка.

Пример соединения двух UNO:

UART на Arduino:

На Arduino и Arduino-совместимых платах аппаратный UART обозначается символами RX и TX рядом с соответствующими выводами. На Arduino UNO/Piranha UNO это 0 и 1 цифровые выводы:

Arduino UNO/Piranha UNO

В скетче инициализируется функцией begin() в коде функции setup():

Serial.begin( СКОРОСТЬ );
Serial.begin( СКОРОСТЬ, ПАРАМЕТРЫ );

Пример:

void setup()

Piranha ULTRA

На Piranha ULTRA присутствуют два аппаратных UART. Один на тех же выводах, что и UNO, второй на 8 (RX) и 9 (TX) выводах:

В Arduino IDE второй аппаратный UART называется Serial1 (Сериал один), и инициализируется так же как и первый:

Простой пример для копирования буфера первого UART’а во второй и наоборот:

void setup() < // Инициируем UART Serial.begin(9600); Serial1.begin(9600); >void loop() < // Пока буфер первого UART не пуст while(Serial.available()) < // Выводим следующий байт FIFO в буфер второго Serial1.write(Serial.read); >// Пока буфер второго UART не пуст while(Serial1.available()) < // Выводим следующий байт FIFO в буфер первого Serial.write(Serial1.read); >>

Arduino MEGA

У Arduino MEGA, помимо UART’a на цифровых выводах 0 и 1 как и у UNO, присутствуют ещё три аппаратных UART. На плате это выводы 19 (RX1), 18 (TX1), 17 (RX2), 16 (TX2) и 15 (RX3), 14 (TX3) соответственно. UART совместимый по расположению с UNO обозначен RX0, TX0:

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

Отладка проектов при помощи UART

В совокупности с монитором последовательного порта UART может быть очень полезен для отладки кода. Например, если не понятно доходит ли Ваш код до определённого места или какие значения принимает переменная, можно вызвать функцию println() и вывести значение переменной или какое-нибудь сообщение в монитор порта. В Arduino IDE монитор порта находится в меню Инструменты -> Монитор порта, так же его можно вызвать нажав пиктограмму лупы в правом верхнем углу главного окна Arduino IDE или вызвать с клавиатуры комбинацией клавиш Ctrl+Shift+M. Перед вызовом монитора порта необходимо выбрать порт с которым Вы хотите работать. Сделать это можно в меню Инструменты -> Порт.

Для удобства отладки можно указать директивы препроцессора языка Си #define , #ifdef , #ifndef

Пример:

/* * Определяем DEBUG. * Если эту строку удалить * или закомментировать * код от #ifdef DEBUG до * #endif не будет скомпилирован * и в монитор порта (в данном примере) * ничего не будет выведено. */ #define DEBUG void setup() < // Инициируем последовательный порт Serial.begin(9600); /* * Ждём старта последовательного порта * (необходимо для чипов со встроенным * USB-UART преобразователем). */ while(!Serial); >void loop() < // Создаём флаг составного числа. bool not_prime = false; for (int n = 2; n < 100; n++) < for (int i = 2; i < n / 2; i++) < // Проверяем факторы (делители) числа. if (n % i == 0) < /* * Если есть факторы * устанавливаем флаг, * выходим из цикла проверки. */ not_prime = true; break; >> /* * Если определён DEBUG * выводим простые числа * в монитор порта. */ #ifdef DEBUG if (not_prime == false) < Serial.println(n); >#endif not_prime = false; > // Останавливаем выполнение скетча. while(true); >

Программный UART на Arduino

Помимо аппаратного UART в Arduino можно использовать программный. Программный порт хорошо подходит для простых проектов, не критичных к времени работы кода или для отладки проектов, позволяя не отключать модули использующие UART во время загрузки сетчей. При его использовании нужно лишь помнить что никакой другой код не может выполняться пока программа занимается считыванием данных из него и передача может осуществляться только в полудуплексном или симплексном режимах. Так же на программный RX можно назначать только те выводы, которые поддерживают прерывание по смене уровней. На UNO, например, это все цифровые выводы, кроме 13-го. Прежде чем собирать свой проект, проконсультируйтесь с инструкцией к конкретной плате.

Пример использования программного порта:

// Определяем вывод RX #define RX 8 // Определяем вывод TX #define TX 9 // Подключаем библиотеку программного UART #include // Создаём объект программного UART SoftwareSerial mySerial(RX, TX);

Далее к программному порту нужно обращаться через объект mySerial . Например: mySerial.write(data); .

UART на Raspberry Pi:

На Raspberry Pi UART находится на выводах колодки 8 — TX (GPIO14) и 10 — RX (GPIO15)

Перед работой с последовательным портом необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> Serial Port

Пример работы с последовательным портом на Python:

# Подключаем модуль для работы с последовательным портом import serial # Конфигурируем последовательный порт serialport = serial.Serial("/dev/ttyS0", 9600, timeout=0.5) # Выводим байтовую строку в порт serialport.write(b'iArduino.ru') # Входим в бесконечный цикл while True: # Если буфер порта не пуст if serialport.in_waiting: # Записываем данные из буфера в список response = serialport.readlines() # Выводим эти данные в stdin, декодируя в UTF-8 и удаляя пустые символы print(response[0].decode("utf-8").strip()) # Если нужны "сырые данные" с символами возврата каретки и новой строки # print(response) # .readlines() возвращает список байтовых строк

Данный пример выводит строку «iArduino.ru» в последовательный порт Raspberry и ждёт данных из последовательного порта.

Подробнее о UART:

Параметры

При обозначении параметров UART принято использовать короткую запись ЦИФРАБУКВАЦИФРА

  • ЦИФРА — количество бит в кадре
    • от 5 до 9 бит. Обычно 8.
    • N — None (Отсутствует) без бита чётности
    • E — Even (Чётный). Проверка данных на чётность. Перед стоп-битом в кадр добавляется бит: 0 если в кадре было нечётное количество единиц, 1 — если чётное.
    • O — Odd (Нечётный). Проверка данных на нечётность. Перед стоп-битом в кадр добавляется бит: 1 если в кадре было нечётное количество единиц, 0 — если чётное.
    • 1, 1.5, 2. Продолжительность стоп-бита (1, 1.5 или 2 битовых интервала)

    Таким образом, стандартные настройки в Arduino: 8-N-1

    Кадрирование данных

    При приёме-передаче данных каждое устройство ориентируется на своё внутреннее тактирование. Обычно это тактирование от 8 до 16 раз быстрее скорости передачи данных и обычно отсчитывается от стартового бита. Именно поэтому необходимо чтобы оба устройства были настроены на одну и ту же скорость передачи.

    Так же при передаче данных присутствуют синхронизирующие биты, именуемые старт-бит и стоп-бит. Старт-бит сигнализирует о начале передачи данных и стоп-бит, соответственно об окончании.

    Рассмотрим кадр данных:

    При разговорах о серийный протоколах принято использовать такие слова как кадр и пакет. Кадр — интервал от старт-бита до стоп-бита. Пакет — количество кадров полезных данных. При этом не стоит путать кадр и байт: байт — это только сами данные, не включающие в себя синхронизирующие и проверочные биты.

    Старт-бит:

    При отсутствии передачи линия удерживается в состоянии логической единицы (в случае TTL Arduino это 5 вольт или Vcc). Как только передающее устройство притягивает линию к 0 (GND или 0 вольт в случае Arduino), это сигнализирует принимающему устройству о том что сейчас будет передача данных.

    _______ ____ ____ ____ ____ ____ ____ ____ ____ __________ \____/____X____X____X____X____X____X____X____X | старт-бит [данные . ] [стоп-бит] 

    Данные:

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

    _______ ____ ____ ____ ____ ____ ____ ____ ____ __________ \____/____X____X____X____X____X____X____X____X | | | | | | | | [старт-бит] данные . [стоп-бит] 

    Стоп-бит:

    По завершении передачи данных принимающее устройство ожидает стоп-бит, который должен быть на уровне логической единицы. Если по завершении кадра удерживается логический ноль, значит данные неверны. Если логический ноль удерживается время, превышающее длину кадра в 1,5 раза, такое состояние именуется break (разрыв линии, исторически пошло от устройств, использующих токовую петлю для передачи данных). Некоторые передатчики вызывают это состояния специально перед посылкой пакета данных. Некоторые приёмники считают такое состояние за неправильно выставленную скорость и сбрасывают свои настройки на установки «по умолчанию».

    _______ ____ ____ ____ ____ ____ ____ ____ ____ __________ \____/____X____X____X____X____X____X____X____X | [старт-бит][данные . ] стоп-бит 

    Скорость передачи данных

    Скорость изменения логических уровней (импульсов) на линии принято измерять в бодах. Единица измерения названа так в честь французского изобретателя Жана Мориса Эмиля Бодо.

    Скорость при использовании UART может быть любой, единственное требование — скорости передающего и принимающего должны быть одинаковы. Стандартная скорость UART принята за 9600 бод. Arduino без проблем и лишних настроек может принимать и передавать данные на скоростях до 115200 бод.

    Так как при передаче данных присутствуют синхронизирующие биты, именуемые старт-бит и стоп-бит, не совсем корректно говорить, что скорость 9600 бод равна 9600 битам в секунду. Если речь идёт о полезных данных, то реальная скорость на 20% ниже. Например, если выставлены параметры 8-N-1 и 9600 бод, то на передачу одного байта уходит десять бит, и 9600/10 = 960 байт, что равно 7680 битам в секунду.

    Методы связи

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

    • Полнодуплексная — когда ведущий и ведомый могут одновременно принимать и передавать (одновременная передача в обе стороны)
    • Полудуплексная — когда ведущий и ведомый поочерёдно принимают и передают (Поочерёдная передача в обе стороны)
    • Симплексная — когда ведущий или ведомый только передают (Передача в одну сторону)

    Чем прослушать протокол uart

    Текущее время: Сб мар 09, 2024 21:42:18

    Часовой пояс: UTC + 3 часа

    Запрошенной темы не существует.

    Часовой пояс: UTC + 3 часа

    Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
    Русская поддержка phpBB
    Extended by Karma MOD © 2007—2012 m157y
    Extended by Topic Tags MOD © 2012 m157y

    Работоспособность сайта проверена в браузерах:
    IE8.0, Opera 9.0, Netscape Navigator 7.0, Mozilla Firefox 5.0
    Адаптирован для работы при разрешениях экрана от 1280х1024 и выше.
    При меньших разрешениях возможно появление горизонтальной прокрутки.
    По всем вопросам обращайтесь к Коту: kot@radiokot.ru
    ©2005-2024

    Протокол передачи данных UART

    Универсальный асинхронный приёмопередатчик

    Предисловие

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

    Параллельный или последовательный?

    Параллельные интерфейсы передают одновременно (параллельно) несколько бит информации (отсюда, собственно и их название). Для передачи данных такие интерфейсы требуют наличия шин, состоящих из 8, 16 или более проводников.

    Протокол передачи данных UART

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

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

    Протокол передачи данных UART

    Пример последовательного интерфейса, передающего один бит в течение каждого тактового импульса CLK. Требуется всего 2 провода.

    Эти два интерфейса можно сравнить с потоком автомобилей. Параллельный интерфейс — это широкое шоссе с количеством полос движения более восьми, а последовательный интерфейс больше поход на двухполосную сельскую дорогу. Мега — Шоссе, потенциально, имеет бОльшую пропускную способность, но очень дорого с точки зрения строительства. Сельская дорога просто выполняет свою функцию и стоит во много раз дешевле многополосного мега-шоссе.

    Вне всякого сомнения, параллельные интерфейсы имеют свои преимущества. Это прямота, быстрота, и легкость реализации. Но мы получаем это за счет большого количества проводов (линий) передачи данных. Если вам когда либо приходилось разрабатывать программы для микроконтроллеров (например в среде Arduino), вы наверняка знаете, насколько драгоценными могут быть линии ввода/вывода. Поэтому мы часто останавливаем свой выбор именно на последовательной связи, жертвуя скоростью, но экономя драгоценные порты микроконтроллера.

    Асинхронный последовательный интерфейс

    За время существования цифровой техники были созданы десятки последовательных протоколов. USB (универсальная Последовательная Шина) и Ethernet — это пример двух наиболее популярных сейчас последовательных протоколов. Другие очень популярные последовательные интерфейсы — это SPI, I2C и последовательный интерфейс, о котором пойдет речь в этой статье. Каждый их этих интерфейсов можно отнести к одной из двух подгрупп — Асинхронные и Синхронные.

    Синхронный протокол всегда включает линию тактового сигнала. Это обеспечивает более простую (и зачастую более быструю) передачу данных, но требует как минимум один дополнительный провод. Пример синхронных интерфейсов — это SPI и I2C.

    Асинхронный интерфейс подразумевает , что данные передаются без поддержки внешнего тактового сигнала.Этот метод передачи идеально подходит для минимизации количества проводов, но это означает, но для надежной передачи и приема данных рнужно приложить дополнительные усилия. Последовательный интерфейс, который мы обсудим в этой статье, является наиболее распространенным и старым асинхронным и протоколом. Часто бывает так, что, когда человек говорит «последовательный», он имеет в виду именно этот протокол.

    Асинхронный последовательный интерфейс, о котором здесь идет речь, широко используется во встраиваемых системах. Если вы хотите добавить в свой проект модуль GPS, Bluetooth, XBee, последовательные ЖК-дисплеи или многие другие внешние устройства, вам, вероятно, придется столкнуться с одним из последовательных интерфейсов.

    Протокол передачи данных UART

    Правила последовательного интерфейса.
    Асинхронный последовательный протокол имеет ряд встроенных правил — механизмов, которые помогают обеспечить надежную и безошибочную передачу данных. Это те механизмы, которые позволяют передавать данные без использования внешнего тактового сигнала:

    • Биты данных
    • Биты синхронизации
    • Биты проверки четности
    • Скорость передачи

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

    Скорость передачи

    Данный параметр определяет скорость передачи данных по последовательной линии. Обычно это выражается в единицах бит в секунду (бит / с или БОД). Если вы инвертируете этот параметр, выраженный в бодах, то получите время, которое требуется для передачи одного бита. Это значение определяет, как долго передатчик держит последовательную линию в высоком / низком состоянии или в какой период принимающее устройство производит выборку своей линии.

    Скорость передачи может быть практически любой в пределах разумного. Единственное требование заключается в том, что оба устройства работали с одинаковой скоростью. Одна из наиболее распространенных скоростей передачи, особенно для простых применений, где скорость не критична, составляет 9600 бит / с. Другие «стандартные» скорости — 1200, 2400, 4800, 19200, 38400, 57600 и 115200.

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

    Кадры данных

    Каждый блок данных (обычно это байт) фактически отправляется в пакете или кадре битов. Кадры создаются путем добавления бит синхронизации и бит четности к битам данным.

    Протокол передачи данных UART

    Один кадр (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 данных? Приведем пример:

    Протокол передачи данных UART

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

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

    Последовательная шина состоит всего из двух проводов: один для отправки данных и другой — для приема. Таким образом, последовательные устройства должны иметь два последовательных контакта: приемник, ( RX ) и передатчик ( TX ).

    Протокол передачи данных UART

    Важно понимать, что обозначения 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.

    Протокол передачи данных UART

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

    Протокол передачи данных UART

    Во встроенных схемах (внутри одного устройства) намного проще использовать последовательные сигналы формата TTL. Но в случае с длинными линиями передачи данных низкие уровни TTL намного более восприимчивы к потерям и помехам. RS-232 или более сложные стандарты, такие как RS-485, лучше подходят для последовательных передач на большие расстояния.

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

    UART

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

    Протокол передачи данных UART

    Упрощенная схема интерфейса UART

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

    R и T в терминологии UART несут ответственность за отправку и получение последовательных данных. На стороне передачи UART должен создать пакет данных — добавление битов синхронизации и четности — и отправить этот пакет по линии TX в соответствии с установленной скоростью передачи. На стороне приема UART должен проверять линию RX со скоростью, соответствующей ожидаемой скорости передачи в бодах, выбирать биты синхронизации и выделять данные.

    Протокол передачи данных UART

    Внутренняя блок-схема UART (любезно предоставлена Exar ST16C550)

    Более продвинутые UART могут передавать полученные данные в буфер, где они будут оставаться до тех пор, пока микроконтроллер не сможет их получить и обработать. Обычно UART выдают буферизованные данные по принципу «первым вошел — первым вышел» (FIFO). Буферы могут быть как маленькими, так и большими, более тысячи байтов.

    Программный UART

    Если микроконтроллер не имеет встроенного аппаратного UART (или их количество недостаточно для приложения), последовательный интерфейс может быть реализован программно. Это тот подход, который используется в библиотеках Arduino, таких, как SoftwareSerial.Точность работы программно реализуемого UART меньше чем аппаратного, но в крайнем случае можно использовать и такой вариант.

    Общие вопросы

    Это все, что связано с последовательной связью. Я хотел бы обратить ваше внимание на распространенные ошибки, которые допускают инженеры любого уровня опыта. Это досадные ошибки вроде RX-to-TX, TX-to-RX. Удивительно, но это ошибка, которую я допускал несколько раз.

    Несоответствие скорости передачи

    Скорость передачи данных — это вроде языка в последовательной связи. Если два устройства не «говорят» с одинаковой скоростью, данные могут быть либо неверно истолкованы, либо полностью пропущены. Если все принимающее устройство «видит» на своей линии приема гору мусора, проверьте соответствие скоростей передачи и приема.

    Протокол передачи данных UART

    Данные передавались со скоростью 9600 бит/с, но получены со скоростью 19200 бит/с. В итоге — гора мусора.

    Объединение шин

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

    Например, если вы подключаете GPS-модуль своего Arduino, вы можете просто подключить TX-линию этого модуля к линии RX Arduino. Но этот вывод Arduino RX уже подключен к контакту TX преобразователя USB-to-serial, который используется всякий раз, когда вы программируете Arduino или используете Serial Monitor. Это порождает возможность возникновения ситуации, когда и модуль GPS, и чип FTDI попытаются передать данные на одной и той же шине одновременно.

    Протокол передачи данных UART

    Два передатчика пытаются отправить данные в одну и ту же шину. Ситуация конкуренции на шине

    В общем, нужно придерживаться правила — одна последовательная шина, два последовательных устройства!

    UART – Последовательный интерфейс передачи данных

    UART - Схема последовательного интерфейса передачи данных

    В сегодняшней статье мы с вами разберемся с последовательным интерфейсом UART, узнаем его плюсы и минусы, а также научимся отлаживать программу с помощью Arduino IDE без применения программаторов. Вас заинтересовало? Тогда читайте дальше!

    Серьёзные среды разработки, типа IAR или ATMEL Studio, как правило, содержат в себе либо программный симулятор целевого микроконтроллера, либо имеют программные средства для работы с аппаратными отладчиками.

    Среда Arduino IDE не имеет ни того, ни другого, что значительно усложняет поиск ошибок в программе. Компилятор выявляет только синтаксические ошибки, наряду с которыми существуют еще и логические (написано-то правильно, только не то делает), не говоря уж о подсчёте различных коэффициентов… Программы не пишутся без ошибок!

    Существует множество методов отладки, но практически для всех необходимо физическое соединение с компьютером. Все платы Arduino (кроме Pro и Pro Mini) имеют «на борту» USB-разъём и специальную микросхему, которая преобразует интерфейс UART в USB. Так не будем же придумывать ничего лишнего и сделаем простейшую отладку с помощью интерфейса, который у нас уже есть!

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

    Монитор порта – не единственное средство для работы с ним, в сети можно найти множество программ-мониторов, которые позволяют не только принимать данные, но и стоить графики на их основе, записывать данные в таблицу и многое другое! Это значительно упростит отладку программы.

    Так как интерфейс UART выведен не только к преобразователю интерфейсов, его можно использовать и для связи между платами Arduino или, например, платой и датчиком, но это уже тема для другой статьи.

    UART интерфейс — описание

    UART в переводе с английского звучит как “Универсальный Асинхронный Приёмопередатчик”. Существует ещё его синхронная версия с дополнительной линией тактового сигнала, но она не интересна нам в рамках статьи.

    Диаграмма работы интерфейса UART

    Каждый бит каждого байта передаётся в равный отведённый промежуток времени (фактически, тайм-слот). Стандартным размером данных в посылке является 8 байт, но помимо данных каждый пакет несёт и служебную информацию, а именно:

    • стартовый бит (Обязателен)
    • стоповый бит (Также обязателен, возможно использование 1, 1.5, 2 стоповых битов)
    • бит чётности (Необязателен. Бывает типов Odd, Even)

    Кратко параметры передаваемого сигнала записываются так:

    [кол-во бит данных] [тип чётности] [кол-во стоп-битов], то есть запись 8N1 характеризует сигнал с 8 битами данных, без бита чётности (N – Not) с 1 стоп-битом.

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

    Скорость измеряется в битах в секунду, или коротко – в бодах. Стандарт RS232 подразумевает скорости от 1200 до 115200 бод, хотя по факту существуют скорости и ниже, и выше, причём до десятков мегабод!

    Разумеется, точность везде относительна и скорость никогда не будет равняться 9600 бодам с точностью до единиц. Стандарт предусматривает возможную ошибку в скорости до 5% (не более 3% для уверенного приёма).

    Далее сведены основные сведения о сигнале:

    • в неактивном (IDLE) режиме обе линии данных подтянуты вверх
    • передачу начинает стартовый бит (логический ноль)
    • передачу заканчивает стоп-бит (логическая единица)
    • данные передаются в режиме LSB (младшим битом вперед)
    • для передачи байта требуется минимум 10 бит

    4800, 9600, 19200, 38400, 57600, 115200 бод.

    Скорость передачи (бод) Время передачи одного бита (мкс) Время передачи байта (мкс)
    4800 208 2083
    9600 104 1042
    19200 52 521
    38400 26 260
    57600 17 174
    115200 8,7 87

    UART может быть запущен как в полудуплексном (только приём или только передача) режиме, так и в полнодуплексном режиме, так как линии приёма и передачи разделены. Линия TXD отвечает за передачу, RXD – за приём, соответственно, линии от приёмника к передатчику перекрещиваются (TX-RX, RX-TX).

    Реализация UART в Arduino

    Все платы Arduino, построенные на основе оригинальных, имеют минимум один интерфейс UART, продвинутые же платы, типа Arduino Mega 2560 Или Arduino Due, имею сразу 4 аппаратных интерфейса! Они не загружают контроллер, так как они отделены от ядра; всё, что необходимо – это сконфигурировать порт и запихать данные в буфер, после чего операции передачи пойдут независимо от вас.

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

    Контроллеры Arduino используют логические уровни такие же, каким является питание, то есть для самой популярной платы Arduino UNO уровни будут равны – ноль = 0В, 1 = 5В.

    Выводы подключены к преобразователю интерфейсов через резисторы с сопротивлением 1 КОм, а к гребёнкам по бокам платы – напрямую, поэтому сигналы с гребёнок будут иметь больший приоритет. Периодически это мешает прошивать платы с подключенным датчиком по UART, так как для прошивки тоже используется UART.

    Микросхема преобразователя интерфейсов не делает из себя ещё один COM-интерфейс для компьютера, она лишь эмулирует его. Несмотря на это, все программы, которые работают с COM-портом посредством Windows API (Win32 API), не отличат порт от физического порта компьютера.

    Класс Serial – RS232 в лучших традициях Arduino

    Класс Serial – RS232

    Для удобной работы с последовательным портом разработчики Arduino написали целую библиотеку, которая значительно упрощает работу с портом, абстрагируя конечного пользователя от простой, «железной» работы с регистрами. Класс имеет множество функций, которые будут рассмотрены нами далее. Но сначала надо понять, как же компьютер примет и обработает, а точнее покажет то, что мы ему передали.

    Всё дело в том, что каждый символ раскладки клавиатуры – это тоже байт. И если просто взять и отправить в порт число 65, он не выведет две цифры 6 и 5, а выведет заглавную латинскую букву А. Почему так? Потому что в таблице кодировки буква А имеет код 65. Класс позволяет выбрать между текстовым и бинарным методом передачи данных, то есть мы сможем отправить число 65 и как букву, и как число.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *