UART and RS 232 - el-pths/w GitHub Wiki
UART и RS-232 (последовательный порт)
Устройствам на базе микроконтроллеров часто нужно обмениваться данными между собственными частями или с другими устройствами. Например датчик с микроконтроллером может передавать данные на компьютер и обратно.
Один из "старинных" и до сих пор очень популярных способов передачи данных - последовательнй протокол UART (universal asynchronous receiver-transmitter). Последовательным он назван потому, что биты каждого байта передаются по проводу один за другим. Асинхронным - потому что не используется дополнительный провод для передачи импульсов синхронизации (которые могли бы указывать когда считывать следующий бит). Вместо этого передатчик и приемник сигнала настраиваются на заранее выбранную скорость и каждый бит имеет строго определенную длительность.
Рассмотрим подробнее как это работает.
Физика
Для передачи в обе стороны достаточно трех линий (проводов). Один из них "общий" или "земля" - он задает уровень 0 вольт относительно которого измеряются сигналы на других линиях. Обычно он соединен с минусом питания на обоих устройствах.
Также у каждого устройства есть контакт TX для передачи данных (T - transmit) и RX для приема (R - receive). Одна из сигнальных линий соединяет TX одного с RX другого, а вторая наоборот. Если передача требуется только в одну сторону (например, с датчика на компьютер), то, конечно, сигнальная линия может быть только одна.
Логика
Как же передаются данные от TX одного устройства к RX другого? Рассмотрим график сигнала, передающего один байт.
Передача происходит так:
- Передатчик и приемник заранее настроены на одинаковую скорость передачи, например 300 бит в секунду (для единицы "бит в секунду" используется историческое название "бод" или по-английски "baud").
- Пока ничего не передается, линия находится в состоянии "логической единицы", т.е. на ней условно "высокое" напряжение (5 или 3.3 вольта в зависимости от типа передатчика).
- К байту, состоящему обычно из 8 бит, добавляются еще два. В начале "стартовый", равный 0 - а в конце "стоповый", равный 1. Поэтому "пакет" передачи одного байта состоит из 10 бит.
- Биты передаются по очереди, без задержек между ними: сначала стартовый, потом восемь бит данных (начиная с младшего) и наконец стоповый.
- Время передачи каждого бита определяется установленной скоростью, например это 1/300 доля секунды (3.3мс)
- Приемник знает что стартовый бит всегда 0, поэтому как только линия из постоянной логической 1 опустилась в 0, он "догадывается" что началась передача байта.
- Приемник "отсчитывает" десять бит с заданной скоростью и запоминает напряжение в середине интервала каждого бита (на рисунке зеленые отметки).
- Далее из десяти считанных байт отбрасываются первый и последний - и отдаются как результат микроконтроллеру (или другому устройству принимающему данные).
В частности на картинке видно что после стартового бита следует 1, далее четыре 0, еще две 1, один 0 и стоповый
бит. Помня что передача идет с младшего бита, запишем их в обратном порядке: 01100001
- это число 97 (код буквы "a" латинское, маленькое).
Приемник может сигнализировать ошибку если стартовый бит оказался не 0 или стоповый не 1 (это может случиться если скорости не совпадают или сильные помехи в линии).
Подключение к компьютеру
В чистом виде протокол UART не используется на внешних разъемах компьютера, поскольку он низковольтный и более актуален для передачи между узлами внутри какого-то сложного устройства.
Однако существуют две возможности работать с UART с компьютера:
- через COM-порт (разъем старого типа, интерфейс RS-232 - на новых компьютерах и особенно ноутбуках может отсутствовать)
- UART-to-USB переходник, который при подключении к компьютеру представляется в системе "виртуальным" COM-портом.
Программ, умеющих отправлять и принимать данные из COM-порта много, например Putty под Windows, picocom под Linux, встроенный терминал в Arduino IDE и так далее.
В случае с USB переходник предпочтительно использовать готовый - внутри он обычно использует какую-либо микросхему (классическая FT232 или более дешевые аналоги) для сложного USB-протокола.
Физический же COM-порт отличается от UART только уровнями напряжения и наличием дополнительных сигналов:
- уровнем логической единицы считается отрицательное напряжение (от -3 до -25), а логического нуля - положительное (от +3 до +25) - такой большой размах позволяет успешнее отличать сигнал от помех при передаче на большие расстояния (десятки и сотним метров).
- дополнительные сигналы (типа "линия свободна", "готов к приему", "готов к передаче" и т.п.) выведены на дополнительные контакты разъёма и их нужно соединить особым образом чтобы порт "думал" что как только он готов что-то отправить, приемник на "той стороне" всегда готов принимать.
Преобразование уровней напряжения можно выполнить либо небольшой схемой на двух транзисторах, либо использовать "классическую" микросхему MAX232 или аналог. Она с помощью хитроумного соединения конденсаторов умеет генерировать отрицательные и положительные напряжения, однако ей нужно питание (5В) которое можно взять либо с платы устройства на стороне UART, либо от какого-то еще разъема компьютера. Сам COM-порт линии питания не имеет, хотя его все-таки можно получить из "дополнительных" сигналов (так делали старые компьютерные "мыши"), но обычно это не рекомендуется.
Подключение к COM-порту следует выполнять так, как на рисунке: контакт 5 является общим, контакт 2 это прием (RX), а 3 - передача (TX); кроме этого контакты 1-4-6 замыкаются между собой, отдельно замыкаются контакты 7-8; контакт 9 никуда не подключается. Такое соединение часто называют "нуль-модемным" по историческим причинам.
Для использования микросхемы MAX232 ее следует подключить к питанию и линиям UART (с одной стороны) и RS-232 (с другой), а также добавить 5 конденсаторов по 1мкФ (лучше неполярных) согласно схеме: