Перейти к содержанию

Интерфейс RS-232

RS-232 — последовательный интерфейс «точка — точка» с биполярными уровнями: передатчик выдаёт ±5…±15 В, приёмник различает сигнал уже при ±3 В, а логическая «1» передаётся минусом. Ниже — параметры стандарта, распиновка DE-9 и DB-25, нуль-модемные кабели, преобразователи MAX232 и MAX3232 и подключение к микроконтроллеру с примером кода.

Обновлено Редакция GAW

RS-232 — стандарт физического уровня для последовательной передачи данных между двумя устройствами: оконечным оборудованием данных (DTE — терминал, компьютер) и аппаратурой окончания канала данных (DCE — например, модем). Действующая редакция называется TIA-232-F; её электрические характеристики согласованы с рекомендацией ITU-T V.28, а назначение цепей — с V.24. Каждый сигнал идёт по своему проводу относительно общей земли, и логическая «1» передаётся отрицательным напряжением, а «0» — положительным.

Интерфейс создавали для подключения модемов, но с распространением персональных компьютеров он стал стандартным недорогим последовательным портом: к нему подключали мыши, принтеры, плоттеры, сканеры и измерительные приборы (TI, SLLA037A). По стандарту скорость не выше 20 кбит/с, современные драйверы держат 120–250 кбит/с на коротком кабеле.

Коротко

  • Уровни: передатчик — от 5 до 15 В любой полярности на нагрузке 3–7 кОм, приёмник — порог ±3 В; между −3 и +3 В состояние не определено.
  • Инверсная логика: «1» (MARK) и покой линии — минус, «0» (SPACE) — плюс; сигналы управления включены при плюсе.
  • Скорость и длина: по стандарту до 20 кбит/с и до 2500 пФ ёмкости линии — около 15–20 м; быстрые драйверы — до 250 кбит/с на кабеле около 3 м.
  • Разъём DE-9 («DB9») у компьютера: 2 — RxD, 3 — TxD, 5 — общий провод; для связи хватает этих трёх.
  • Точка — точка: на каждой линии один передатчик и один приёмник, дуплекс по TxD и RxD, общий провод обязателен.
  • Преобразователи: MAX232 — 5 В и четыре конденсатора по 1 мкФ, MAX3232 — от 3 до 5,5 В и по 0,1 мкФ.

Стандарт RS-232: TIA-232-F, V.24 и V.28

Ассоциация EIA выпустила стандарт в 1962 году, чтобы унифицировать подключение терминала к модему. Главные редакции:

РедакцияГодЧто важно
EIA RS-2321962первая редакция
RS-232-C1969кабель короче 15 м рекомендован, более длинный допустим при соблюдении нормы ёмкости
EIA-232-D1986вместо длины кабеля — ёмкость нагрузки до 2500 пФ; цепи шлейфовых проверок на контактах 18, 21 и 25
EIA/TIA-232-E1991цепь «готов к приёму» и аппаратное управление потоком через RTS/CTS; компактный 26-контактный разъём Alt A
TIA-232-F1997действующая; без изменений, нарушающих совместимость, согласована с V.24, V.28 и ISO/IEC 2110
EIA/TIA-5741990отдельный стандарт на 9-контактный разъём для асинхронного обмена

Стандарт описывает интерфейс с трёх сторон: электрические характеристики сигналов (ITU-T V.28), функции цепей обмена (ITU-T V.24) и механику — 25-контактный разъём D-типа с назначением контактов (ISO/IEC 2110). Функции назначены 22 контактам из 25, но полный набор почти не встречается. RS-232 годится и для синхронной передачи: тактовые сигналы идут по контактам 15, 17 и 24 разъёма DB-25. Девятиконтактный вариант по EIA/TIA-574 рассчитан только на асинхронный обмен, цепей синхронизации в нём нет.

Формат кадра — старт-бит, данные, чётность, стоп-биты — RS-232 не задаёт: его определяют UART и протокол обмена.

RS-232 и UART — не одно и то же

UART (universal asynchronous receiver/transmitter) — узел микросхемы, который превращает байт в последовательность бит: добавляет старт- и стоп-биты, при необходимости бит чётности, и выполняет обратное преобразование на приёме. На выводах UART микроконтроллера — логические уровни: «1» — высокий уровень, 3,3 или 5 В, «0» — около нуля, в покое линия в «1». Такой вариант в обиходе называют «UART с уровнями TTL» или просто TTL.

RS-232 передаёт тот же кадр иначе: уровнями ±5…±15 В и в инверсии — «1» превращается в минус, «0» в плюс. Преобразователь вроде MAX3232 одновременно сдвигает уровень и инвертирует сигнал (Maxim, AN2141). UART — это то, что передаётся, а RS-232 — один из способов передать это по кабелю. Есть и другие: RS-485 для длинных линий, оптопары, логические уровни внутри одного прибора.

Уровни сигналов RS-232

Передатчик, нагруженный на 3–7 кОм, должен выдавать от 5 до 15 В по модулю. Приёмник обязан распознать «1», если напряжение ниже −3 В, и «0», если выше +3 В. Полоса от −3 до +3 В — переходная зона: состояние в ней не определено, и сигнал проходит её только на фронте (V.28, разделы 4–6). Разница между 5 В на выходе и 3 В на входе — запас помехоустойчивости не меньше 2 В (TI, SLLA037A).

Уровни сигналов RS-232: выход передатчика, пороги приёмника и переходная зонаПередатчик на нагрузке 3–7 кОм выдаёт от +5 до +15 В для логического нуля (SPACE) и включённого сигнала управления (ON) и от −5 до −15 В для логической единицы (MARK) и выключенного сигнала (OFF). Приёмник считает напряжение выше +3 В нулём или ON, ниже −3 В — единицей или OFF; между −3 и +3 В лежит переходная зона, где состояние не определено. Разница между 5 и 3 В — запас помехоустойчивости 2 В.Передатчикнагрузка 3–7 кОмПриёмникпороги ±3 ВU, В+15+5+30−3−5−15«0» · ON+5…+15 В«1» · OFF−5…−15 Втолькона фронтах«0» · ONвыше +3 Вне определено−3…+3 В«1» · OFFниже −3 В2 В2 ВПлюсданные (TxD, RxD): «0», SPACEуправление (RTS, DTR…): ONПереходная зонасигнал проходит её толькона фронте, ≤ 4 % длительности битаМинусданные: «1», MARK — и покой линииуправление: OFFБез нагрузки — до ±25 В (TIA-232-F)
Зоны уровней RS-232: передатчик под нагрузкой выдаёт ±5…±15 В, приёмник различает уровни начиная с ±3 В. Синим — плюс (SPACE, ON), оранжевым — минус (MARK, OFF).

Логика инверсная, и правила для цепей данных и управления разные (V.28, таблица 1):

Напряжение на линииЦепи данных: TxD, RxDЦепи управления: RTS, CTS, DTR, DSR, DCD, RI
ниже −3 В«1», MARKOFF, выключено
от −3 до +3 Вне определеноне определено
выше +3 В«0», SPACEON, включено

Когда передавать нечего, линия данных стоит в MARK, под минусом; старт-бит переводит её в SPACE, на плюс. С сигналами управления наоборот: «DTR включён» означает плюс на контакте 4.

Реальные приёмники точнее стандарта. У MAX232 порог при нарастании напряжения — 1,7 В типично (не больше 2,4 В), при спаде — 1,2 В (не меньше 0,8 В), гистерезис около 0,5 В (TI). Поэтому сигнал 0/5 В от логики часто проходит через приёмник RS-232 — правда, инвертированным и без гарантий стандарта. Вход приёмника внутри стянут к земле резистором около 5 кОм, и при оборванном кабеле приёмник выдаёт «1», как в покое (таблица функций MAX232). V.28 описывает именно такую реакцию на обрыв: цепи данных считаются в «1», цепи управления — в OFF.

Электрические параметры по TIA-232-F и ITU-T V.28

ПараметрЗначениеПримечание
Напряжение передатчика без нагрузкине больше 25 В по модулюV.28 — не больше 15 В и предупреждает, что у старого оборудования бывает до 25 В
Напряжение передатчика на нагрузке 3–7 кОмот 5 до 15 В по модулюлюбой полярности
Сопротивление нагрузки — входа приёмника3–7 кОмпо постоянному току, при входном напряжении 3–15 В по модулю
Напряжение холостого хода входа приёмникане больше 2 В
Ёмкость нагрузкине больше 2500 пФвместе с кабелем и входом приёмника
Пороги приёмника−3 и +3 Вмежду ними — переходная зона
Время прохождения переходной зоныне больше 4 % длительности бита и не больше 1 мсV.28 — 3 %; для сигналов управления — до 1 мс
Скорость нарастанияне больше 30 В/мксограничивает перекрёстные помехи между жилами
Ток короткого замыканияне больше 0,5 Амежду любыми двумя цепями, по V.28
Сопротивление выключенного передатчикане меньше 300 Омпри напряжении до 2 В
Скорость передачидо 20 кбит/сприложение A к V.28 — до 64 кбит/с для существующего оборудования

Сопротивление 3–7 кОм — это вход самого приёмника, а не отдельный резистор: у MAX232 и MAX3232 входное сопротивление 3–7 кОм, типично 5 кОм. Передатчик обязан выдерживать обрыв и замыкание на любую другую цепь без повреждения (V.28, раздел 4), и реальные микросхемы ограничивают ток намного жёстче, чем требует норма: MAX232 — ±10 мА типично, MAX3232 — ±35 мА типично и не больше ±60 мА.

Норма для выключенного передатчика — не меньше 300 Ом при напряжении до 2 В — стоит в разделе V.28 об обнаружении неисправностей: выключенного питания, обрыва или замыкания кабеля, отсутствия передатчика на другом конце.

Скорость и длина линии RS-232

Предел стандарта — 20 кбит/с. Его задают две нормы: скорость нарастания не больше 30 В/мкс, чтобы фронты не наводили помехи на соседние жилы, и время прохождения переходной зоны не больше 4 % длительности бита. Зону шириной 6 В сигнал со скоростью 30 В/мкс проходит минимум за 0,2 мкс; бит должен быть в 25 раз длиннее — 5 мкс, отсюда теоретический потолок 200 кбит/с. На практике TI оценивает его в 120 кбит/с (SLLA037A). Приложение A к V.28 разрешает существующему оборудованию работать до 64 кбит/с, если ограничить ёмкость линии или принять постоянное время перехода 1,5 мкс.

Длину кабеля RS-232-C рекомендовала держать до 15 м (50 футов), но разрешала и длиннее при соблюдении нормы ёмкости. С редакции D ограничение сформулировано только через ёмкость: не больше 2500 пФ на цепь вместе со входом приёмника. TI оценивает это в 15–20 м в зависимости от ёмкости кабеля. Для конкретного кабеля:

Lmax≈2500 пФ−CвхCпог,L_\text{max} \approx \frac{2500\ \text{пФ} - C_\text{вх}}{C_\text{пог}},

где CвхC_\text{вх} — входная ёмкость приёмника (TI закладывает до 20 пФ), CпогC_\text{пог} — ёмкость жилы относительно остальных жил и экрана на метр длины, из документации на кабель. Например, при 130 пФ/м получается около 19 м. Экран увеличивает погонную ёмкость, поэтому экранированный кабель допускает меньшую длину, чем такой же без экрана.

На скоростях выше 20 кбит/с длину ограничивает ток передатчика: чтобы перезарядить ёмкость линии за 4 % бита, нужны десятки миллиампер. Поэтому для высоких скоростей TI на практике ограничивает кабель примерно 3 м.

СкоростьДлина кабеляОснование
до 20 кбит/спока ёмкость линии не больше 2500 пФ — около 15–20 мTIA-232-F, V.28; оценка TI
до 20 кбит/сдо 15 мрекомендация RS-232-C
115,2–250 кбит/с (MAX232, MAX3232)около 3 моценка TI для скоростей выше 20 кбит/с

Драйверы работают быстрее стандарта, но при оговорённой нагрузке: MAX232 — 120 кбит/с, MAX3232 — 250 кбит/с типично и не меньше 150 кбит/с на нагрузке 3 кОм и 1000 пФ (TI). Если нужно дальше или быстрее, RS-232 меняют на RS-485: дифференциальная пара работает на сотнях метров.

Разъёмы и распиновка DE-9 (DB9) и DB-25

TIA-232 описывает 25-контактный разъём D-типа; в редакции E к нему добавлен компактный 26-контактный Alt A. Девятиконтактную распиновку используют компьютеры IBM PC/AT и совместимые, и её закрепили отдельным стандартом EIA/TIA-574 (Black Box). По стандарту у DTE — вилка со штырями, у DCE — розетка с гнёздами, а кабель относится к DTE (Datapro, RS-232-C и 232-E). COM-порт компьютера — это DTE с вилкой DE-9.

Почему «DB9» — неправильное, но привычное название

Разъёмы D-sub обозначают буквой размера корпуса и числом контактов. В каталоге ITT Cannon корпус A — для 15 контактов, B — 25, C — 37, D — 50, E — 9. Девятиконтактный разъём — DE-9, а «DB-9» означал бы 9 контактов в корпусе 25-контактного. Название DB9 прижилось по аналогии с DB-25 и встречается даже в документах производителей микросхем, так что в магазине и в поиске это один и тот же разъём.

DE-9DB-25Цепь V.24СигналУ DTEНазначение
18109DCDвходDCE принимает сигнал линии, например несущую удалённого модема
23104RxDвходпринимаемые данные
32103TxDвыходпередаваемые данные
420108/2DTRвыходDTE готов к работе
57102GND—сигнальная земля, общий провод
66107DSRвходDCE готов к работе
74105RTSвыходзапрос передачи; при управлении потоком — «готов к приёму»
85106CTSвходDCE готов принимать данные для передачи
922125RIвходвходящий вызов
—1—экран—соединение с корпусом; в RS-232-C — защитная земля
Распиновка разъёма DE-9 (DB9) интерфейса RS-232, вид спередиВилка DTE, например COM-порт компьютера, вид на штыри: верхний ряд слева направо — 1 DCD, 2 RxD, 3 TxD, 4 DTR, 5 GND; нижний ряд — 6 DSR, 7 RTS, 8 CTS, 9 RI. Ответная розетка, вид на гнёзда, зеркальна: верхний ряд слева направо — 5, 4, 3, 2, 1, нижний — 9, 8, 7, 6. Цепи TxD, DTR и RTS идут от DTE к DCE, остальные — от DCE к DTE, контакт 5 — общий провод.Вилка DTE (COM-порт ПК)вид на штыриРозетка (кабель или порт DCE)вид на гнёзда — нумерация зеркальная1DCD2RxD3TxD4DTR5GND6DSR7RTS8CTS9RI5GND4DTR3TxD2RxD1DCD9RI8CTS7RTS6DSRот DTE к DCEот DCE к DTEобщий провод
Разъём DE-9, вид спереди: на розетке нумерация зеркальная, и при распайке кабеля об этом легко забыть.

Компьютерный порт DE-9 — это три выхода (TxD, RTS, DTR) и пять входов (RxD, CTS, DSR, DCD, RI). Под такой набор выпускают микросхемы на три передатчика и пять приёмников, например SN75C185 (TI). Для простой связи достаточно контактов 2, 3 и 5. Остальные контакты DB-25 — вторичный канал, синхронизация, шлейфовые проверки — в асинхронных устройствах почти не используются.

DTE и DCE: прямой и нуль-модемный кабель

Названия цепей в RS-232 даны с точки зрения DTE: TxD (цепь 103) — данные от DTE к DCE, RxD (цепь 104) — от DCE к DTE (V.24). У DCE те же контакты работают наоборот: модем принимает по контакту 3 разъёма DE-9 и передаёт по контакту 2. Поэтому кабели бывают двух видов:

  • прямой — для пары DTE и DCE: контакты соединены один в один, 2–2, 3–3, 5–5 и так далее;
  • нуль-модемный (null modem, кросс-кабель) — для двух DTE, например двух компьютеров или компьютера и прибора с вилкой: передатчик одной стороны должен попасть на приёмник другой.

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

Как определить, DTE перед вами или DCE

Нужен мультиметр. Включите устройство, ничего к нему не подключая, и измерьте напряжение на контактах 2 и 3 относительно контакта 5. Передатчик в покое держит MARK — от −5 до −15 В. Вход приёмника нагружен на землю сопротивлением 3–7 кОм, и на нём около нуля: V.28 допускает не больше 2 В. Минус на контакте 3 — это DTE, минус на контакте 2 — DCE. Так же проверяют самодельные кабели и переходники.

Нуль-модем: три варианта распайки

Нуль-модемный кабель DE-9 — DE-9: три варианта распайкиКонтакты перечислены по назначению: 3 TxD, 2 RxD, 7 RTS, 8 CTS, 4 DTR, 6 DSR, 1 DCD, 5 GND. Минимальный кабель: TxD одного разъёма соединён с RxD другого и наоборот, GND с GND. Кабель с петлями квитирования: то же плюс в каждом разъёме перемычки RTS–CTS и DTR–DSR–DCD. Полный нуль-модем: TxD и RxD накрест, RTS одной стороны на CTS другой, DTR одной стороны на DSR другой, DSR и DCD в каждом разъёме соединены, GND с GND.Минимальный3 провода, без квитированияDTE 1DTE 23 TxD3 TxD2 RxD2 RxD7 RTS7 RTS8 CTS8 CTS4 DTR4 DTR6 DSR6 DSR1 DCD1 DCD5 GND5 GNDС петлями квитированияразрешения замкнуты на себяDTE 1DTE 23 TxD3 TxD2 RxD2 RxD7 RTS7 RTS8 CTS8 CTS4 DTR4 DTR6 DSR6 DSR1 DCD1 DCD5 GND5 GNDПолныйквитирование — к собеседникуDTE 1DTE 23 TxD3 TxD2 RxD2 RxD7 RTS7 RTS8 CTS8 CTS4 DTR4 DTR6 DSR6 DSR1 DCD1 DCD5 GND5 GND
Нуль-модемный кабель DE-9 — DE-9. Контакты перечислены по назначению, номер стоит перед названием. Перемычки внутри разъёма нарисованы снаружи колонок.
  • Минимальный, три провода: TxD и RxD накрест, GND к GND. Годится, если ни одна сторона не проверяет сигналы квитирования: без управления потоком или с программным XON/XOFF.
  • С петлями квитирования: в каждом разъёме RTS замкнут на CTS (7–8), а DTR — на DSR и DCD (4–6–1). Порт сам себе выдаёт разрешения, поэтому программа, которая ждёт CTS или DSR, работает по трём проводам. Перемычку на DCD не пропускайте: некоторые устройства и драйверы без этого сигнала не открывают порт (Chipkin). Управления потоком при такой распайке фактически нет.
  • Полный: TxD и RxD накрест, RTS одной стороны на CTS другой, DTR одной стороны на DSR и DCD другой (Perle). Сохраняет аппаратное управление потоком. Цепь RI не подключают.

Управление потоком: RTS/CTS, DTR/DSR и XON/XOFF

Управление потоком останавливает передатчик, когда приёмник не успевает: заполнился буфер или занят процессор.

RTS/CTS — аппаратное. Изначально эта пара обслуживала полудуплексный модем: DTE включает RTS — «хочу передавать», модем переключается на передачу и отвечает CTS — «можно» (V.24, цепи 105 и 106). В редакции EIA/TIA-232-E появилась цепь «готов к приёму» (CJ, цепь 133 по V.24), и при аппаратном управлении потоком её функцию берёт на себя контакт RTS (Datapro, 232-E). В таком режиме каждая сторона держит RTS включённым, пока может принимать, и передаёт, только пока включён её вход CTS. В нуль-модеме RTS одной стороны приходит на CTS другой.

DTR/DSR. Это сигналы готовности оборудования: DTR — DTE включён и готов, DSR — DCE готов (V.24). Их тоже применяют для управления потоком: например, мост CP2102 поддерживает квитирование RTS/CTS, DSR/DTR и XON/XOFF.

XON/XOFF — программное. Приёмник посылает по своей линии TxD символ XOFF — «стоп», а когда освободится, XON — «продолжай». Это управляющие символы DC3 (0x13) и DC1 (0x11) (ECMA-48). Дополнительные провода не нужны, хватает трёхпроводного кабеля. Но для двоичных данных способ не годится: байты 0x11 и 0x13 встречаются в них сами по себе и будут приняты за команды.

Остановка не мгновенная: символ, который уже передаётся, будет допередан, а задержка программы может добавить ещё несколько. Поэтому сигнал «стоп» подают, пока в буфере приёмника остаётся запас.

Кадр UART на линии RS-232

Асинхронный кадр начинается со старт-бита, за ним идут 5–9 бит данных младшим битом вперёд, необязательный бит чётности и один или два стоп-бита; между кадрами линия в покое — в «1» (ATmega328P, раздел 20.4). Приёмник ждёт перепада из «1» в «0» в начале старт-бита, через полбита проверяет, что уровень всё ещё «0», — так отсекается короткая помеха, — и дальше читает каждый бит в его середине (ST16C550; Maxim, AN2141).

Формат записывают тремя символами: число бит данных, чётность (N — без бита чётности, E — even, дополнение до чётного числа единиц, O — odd, до нечётного) и число стоп-битов. Типичный кадр — 8N1: 1 + 8 + 1 = 10 бит на байт, полезных из них 80 %. При 9600 бит/с это 960 байт в секунду, при 115 200 бит/с — 11 520.

Символ A (0x41) в формате 8N1: выход UART микроконтроллера и линия RS-232Кадр из старт-бита, восьми бит данных младшим битом вперёд (1, 0, 0, 0, 0, 0, 1, 0) и стоп-бита. На выводе TX микроконтроллера логическая единица — высокий уровень 3,3 В, покой — тоже единица. На линии RS-232 тот же сигнал инвертирован: единица и покой (MARK) — от −5 до −15 В, ноль и старт-бит (SPACE) — от +5 до +15 В; полоса ±3 В — переходная зона. Точки отмечают середины бит, где приёмник считывает уровень.Старт0D01D10D20D30D40D50D61D70Стоп1TX МКлогика 3,3 В3,3 В0 ВTxD RS-232после MAX3232SPACEMARK+5…+15 В±3 В−5…−15 Всередина бита — здесь приёмник считывает уровеньпри 9600 бит/с бит длится ≈ 104 мкс
Символ «A» (0x41) в формате 8N1: сверху — вывод TX микроконтроллера, снизу — тот же сигнал на линии RS-232 после MAX3232. Уровни перевёрнуты, моменты переключений совпадают. Масштаб амплитуд условный.

0x41 в двоичном виде — 0100 0001. Младший бит идёт первым, поэтому после старт-бита на линии 1, 0, 0, 0, 0, 0, 1, 0, затем стоп-бит. На выводе микроконтроллера «1» — высокий уровень, на линии RS-232 — минус.

Бит чётности — исключающее ИЛИ всех бит данных; при нечётной чётности результат инвертируется (ATmega328P, раздел 20.4.1). Если на месте стоп-бита приёмник видит «0», он фиксирует ошибку кадра (framing error). Состояние break — линия в «0» дольше целого кадра — UART распознаёт отдельно: у UART 16550 для этого есть свой флаг (ST16C550).

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

Стандартные скорости

Привычный ряд 300, 1200, 2400, 4800, 9600, 19 200, 38 400, 57 600, 115 200 бит/с удобен для UART. В UART 16550 частота кварца делится на 16 и на программируемый делитель; с кварцем 1,8432 МГц делитель 1 даёт ровно 115 200 бит/с, а все скорости ряда получаются при целых делителях: 9600 бит/с — делитель 12, 300 бит/с — 384 (ST16C550). Мосты USB–UART поддерживают этот ряд и многие нестандартные скорости.

Насколько могут расходиться частоты

Приёмник заново синхронизируется по каждому старт-биту, поэтому ошибка частоты накапливается только в пределах кадра. Важна не точность каждой стороны, а разность частот передатчика и приёмника (Maxim, AN2141). Хуже всего последнему биту: середина стоп-бита кадра 8N1 отстоит от начала старт-бита на 9,5 бита, при 16 выборках на бит — на 152 такта приёмника. Допустимое расхождение:

δ=±w2 S−1S (N−0,5),\delta = \pm\frac{\dfrac{w}{2}\,S - 1}{S\,(N - 0{,}5)},

где S=16S = 16 — число выборок на бит, NN — длина кадра в битах (10 для 8N1), ww — доля бита, в которой сигнал уже установился, а «−1» учитывает неопределённость момента старта в один такт. Maxim принимает ww = 75 % для короткой «чистой» линии и получает ±3,3 %, а для длинного ёмкостного кабеля RS-232 — ww = 50 % и ±2 %. Этот запас стороны делят между собой в любой пропорции.

Для USART AVR Microchip даёт точные границы. При 8 битах данных без чётности приёмник принимает поток со скоростью от 95,36 до 104,58 % своей, то есть от −4,64 до +4,58 %; с U2X = 1 — от 96,00 до 103,90 %. Рекомендованная ошибка одной стороны — ±2,0 и ±1,5 % соответственно: вторую половину запаса Microchip оставляет передатчику (ATmega328P, таблицы 20-2 и 20-3). В таблице 20-2 для этого случая напечатано −4,54 %, но из её же значения 95,36 % следует −4,64 %.

Кварц с точностью 100 ppm (0,01 %) расходует из этого бюджета ничтожную долю. Керамический резонатор ±0,5 % плюс ещё ±0,5 % дрейфа от температуры и старения на обеих сторонах укладывается даже в жёсткие 2 % (AN2141). А вот внутренний RC-генератор ATmega328P после заводской калибровки точен лишь до ±10 %, после подстройки пользователем — до ±1 % (ATmega328P, таблица 29-9): без калибровки для UART он не годится.

Ошибка скорости у AVR: UBRR и U2X

Генератор скорости USART делит тактовую частоту на 16 (на 8 при U2X = 1) и ещё на UBRR + 1 (ATmega328P, таблица 20-1):

BAUD=fOSC16 (UBRR+1),UBRR=fOSC16⋅BAUD−1.BAUD = \frac{f_\text{OSC}}{16\,(UBRR + 1)}, \qquad UBRR = \frac{f_\text{OSC}}{16 \cdot BAUD} - 1.

UBRR — целое число от 0 до 4095: его округляют до ближайшего целого, и скорость получается не точно заданной. Ошибку считают как (BAUDфакт/BAUD−1)⋅100 %(BAUD_\text{факт} / BAUD - 1) \cdot 100\ \%. Таблица ниже рассчитана по этим формулам для частоты 16 МГц и совпадает с таблицей 20-7 даташита:

Значения UBRR и ошибка скорости USART AVR при тактовой частоте 16 МГц, обычный режим и режим удвоения скорости
Скорость, бит/сUBRR, U2X = 0ОшибкаUBRR, U2X = 1Ошибка
2 400416−0,1 %8320,0 %
4 800207+0,2 %416−0,1 %
9 600103+0,2 %207+0,2 %
14 40068+0,6 %138−0,1 %
19 20051+0,2 %103+0,2 %
28 80034−0,8 %68+0,6 %
38 40025+0,2 %51+0,2 %
57 60016+2,1 % — больше рекомендованного34−0,8 %
76 80012+0,2 %25+0,2 %
115 2008−3,5 % — больше рекомендованного16+2,1 % — больше рекомендованного
230 4003+8,5 % — больше рекомендованного8−3,5 % — больше рекомендованного
250 00030,0 %70,0 %
500 00010,0 %30,0 %
1 000 00000,0 %10,0 %

Тактовая частота 16 МГц. * — ошибка больше рекомендованной Microchip для кадра 8N1: ±2,0 % при U2X = 0 и ±1,5 % при U2X = 1.

Что видно из таблицы:

  • до 38 400 бит/с включительно ошибка не больше 0,8 % по модулю — запас большой;
  • 57 600 бит/с при U2X = 0 даёт +2,1 % — больше рекомендованного; с U2X = 1 ошибка −0,8 %;
  • 115 200 бит/с не укладывается в рекомендацию ни в одном режиме: −3,5 % без удвоения и +2,1 % с ним. Два AVR на 16 МГц с одинаковыми настройками договорятся — их скорости ошибаются одинаково, — а с ПК или модулем, у которого скорость точная, связь идёт у самого края допуска;
  • 250 000, 500 000 и 1 000 000 бит/с получаются из 16 МГц без остатка — ошибка 0 %.

Если нужен весь стандартный ряд без ошибки, ставят кварц, кратный 1,8432 МГц: 7,3728, 11,0592, 14,7456 или 18,432 МГц — с ними все скорости до 230 400 бит/с получаются точно (ATmega328P, таблицы 20-5–20-7). В avr-libc этот расчёт делает заголовок <util/setbaud.h>: по заданным F_CPU и BAUD он вычисляет UBRR_VALUE и признак USE_2X, если без удвоения ошибка превышает BAUD_TOL — по умолчанию 2 %.

Преобразователи уровней: MAX232, MAX3232 и аналоги

Микросхеме нужно получить ±5…±10 В от одного источника 5 или 3,3 В. Для этого внутри стоят два зарядовых насоса на внешних конденсаторах: удвоитель делает из VCC положительное напряжение V+, инвертор из V+ — отрицательное V−. У MAX232 от 5 В получается около +10 и −10 В без нагрузки (Maxim), в типовой схеме TI — около ±8,5 В. Передатчики питаются от V+ и V−, приёмники выдают логические уровни от VCC.

МикросхемаПитаниеКонденсаторы насосаСкоростьВыход на нагрузке 3 кОм
MAX232 (TI)4,5–5,5 В4 × 1 мкФ120 кбит/сот ±5 В, типично ±7 В
MAX232A (Maxim)5 В ± 10 %4 × 0,1 мкФ200 кбит/сот ±5 В, типично ±8 В
MAX3232 (TI)3,0–5,5 В4 × 0,1 мкФ при 3,3 В250 кбит/сот ±5 В, типично ±5,4 В
MAX3232E (TI)3,0–5,5 В4 × 0,1 мкФ при 3,3 В250 кбит/сот ±5 В, типично ±5,4 В
ADM3251E (Analog Devices)5 В4 × 0,1 мкФ460 кбит/с—

Чем ещё они отличаются: MAX232 потребляет 8 мА, MAX3232 — 0,3 мА и при питании 3,3 В принимает на входах 5-вольтовую логику. MAX3232E по основным параметрам совпадает с MAX3232 и дополнительно испытан на стойкость к разрядам по IEC 61000-4-2 (о ней — ниже). ADM3251E — один передатчик и один приёмник с гальванической развязкой 2,5 кВ и встроенным изолированным преобразователем питания isoPower.

MAX232 и MAX3232 совпадают по цоколёвке, но не по конденсаторам: MAX232 нужно 1 мкФ, MAX3232 при 3,3 В — 0,1 мкФ. При питании MAX3232 от 5 В TI рекомендует C1 = 0,047 мкФ и C2–C4 = 0,33 мкФ, а для всего диапазона 3–5,5 В — 0,1 и 0,47 мкФ. Микросхемы с одним названием у разных производителей тоже отличаются: у MAX232 от Maxim типовой размах ±7,3 В и потребление 5 мА, у TI — ±7 В и 8 мА. Сверяйтесь с даташитом того производителя, чья микросхема стоит на плате. Для скоростей до 1 Мбит/с TI предлагает совместимые по выводам с MAX3232 микросхемы SN65C3232 и SN75C3232.

Защита от статики и гальваническая развязка

Разъём RS-232 выходит наружу корпуса, и разряд статики с пальцев или кабеля попадает прямо на выводы трансивера. Для MAX232 TI указывает только 2 кВ по модели человеческого тела (HBM) — это стойкость при производстве и монтаже, а не при работе с открытым разъёмом. Варианты с буквой E испытаны по IEC 61000-4-2: MAX3232E выдерживает ±8 кВ контактным и ±15 кВ воздушным разрядом.

Если у соединяемых устройств разные земли — разные здания, силовые щиты, — по общему проводу RS-232 потечёт уравнивающий ток; V.24 отдельно предупреждает о контурах заземления с большими токами. В таких случаях ставят изолированный трансивер: ADM3251E объединяет развязку 2,5 кВ, изолированный источник питания и один канал RS-232.

USB–UART: FT232R, CP2102, CH340 и уровни TTL

Мосты USB–UART создают в компьютере виртуальный COM-порт, но наружу выдают логические уровни UART, а не RS-232. FT232R и CP2102 выводят и все сигналы модема: RTS, CTS, DTR, DSR, DCD, RI; у CH340 полный набор есть в 16- и 20-выводных корпусах. Чтобы получить настоящий RS-232, после моста ставят преобразователь вроде MAX3232: WCH прямо пишет, что интерфейсы RS-232, RS-485 и RS-422 CH340 обеспечивает через внешние микросхемы.

МостСкоростьЛогические уровниОсобенности
FT232R (FTDI)от 300 бод до 3 Мбод1,8–5,25 В, задаются выводом VCCIOвстроенные тактовый генератор и EEPROM; любую из линий UART можно инвертировать настройкой
CP2102 (Silicon Labs)от 300 бит/с до 1 Мбит/с3,3 В, VDD от 3,0 до 3,6 Вдля новых разработок производитель рекомендует CP2102N
CH340 (WCH)от 50 бит/с до 2 Мбит/с5 или 3,3 В — по напряжению питанияCH340G и CH340T нужен кварц 12 МГц, CH340C, N, K, E, X, B обходятся без него

Модуль TTL или кабель RS-232: как отличить

Внешне похожие адаптеры «USB — COM» бывают двух типов: модули и кабели с выводами UART на уровнях 3,3 или 5 В и адаптеры с разъёмом DE-9 и уровнями RS-232. Проверка — вольтметр между TX и GND у подключённого к USB, но молчащего адаптера:

  • около +3,3 или +5 В — логические уровни: в покое UART держит «1», высокий уровень;
  • от −5 до −15 В — RS-232: в покое передатчик держит MARK.

Настоящие уровни RS-232 требуют преобразователя с зарядовым насосом или отдельного двуполярного питания. Если на плате только мост USB–UART, уровни у неё логические.

Почему RS-232 нельзя подключать к выводу МК напрямую

  • Напряжение. На линии до ±15 В, у старого оборудования — до ±25 В, а предельное напряжение на выводе ATmega328P — от −0,5 В до VCC + 0,5 В (раздел 29.1 даташита). При −10 В на входе RXD открывается защитный диод вывода, и через него течёт ток короткого замыкания передатчика — у MAX232 около 10 мА, у MAX3232 до 60 мА — при предельных для вывода 40 мА.
  • Инверсия. Даже если вход выживет, например благодаря токоограничивающему резистору, данные придут перевёрнутыми: покой RS-232 — минус, а UART в покое ждёт «1».
  • Обратное направление. Выход 0/3,3 В на входе приёмника RS-232: ноль попадает в переходную зону ±3 В, где состояние не определено. Многие приёмники с порогом 1,2–1,7 В его всё же различат — но тоже инвертированным.

Подключение RS-232 к микроконтроллеру

Типовая схема — микроконтроллер, MAX3232 и разъём DE-9. Питание 3,3 В, четыре конденсатора насоса по 0,1 мкФ и ещё 0,1 мкФ по питанию — по типовой схеме TI. C1 включают между выводами 1 и 3, C2 — между 4 и 5, C3 — от V+ (вывод 2) к земле (TI допускает и к VCC), C4 — от V− (вывод 6) к земле. Подойдут керамические конденсаторы; электролитические и танталовые ставят с учётом полярности, и у C4 плюс — на земле, потому что V− отрицательное.

Подключение микроконтроллера к RS-232 через MAX3232 и разъём DE-9Выход TXD микроконтроллера идёт на вход DIN1 (вывод 11) MAX3232, выход DOUT1 (вывод 14) — на контакт 2 розетки DE-9; контакт 3 разъёма идёт на вход RIN1 (вывод 13), выход ROUT1 (вывод 12) — на RXD микроконтроллера. Второй канал: RTS микроконтроллера на DIN2 (10), DOUT2 (7) на контакт 8; контакт 7 на RIN2 (8), ROUT2 (9) на CTS микроконтроллера. Конденсатор C1 0,1 мкФ между выводами 1 и 3, C2 между 4 и 5, C3 от V+ (2) к земле, C4 от V− (6) к земле, C5 0,1 мкФ по питанию 3,3 В на выводе 16. GND микросхемы (15), микроконтроллера и контакт 5 разъёма соединены. Устройство разведено как DCE и подключается к COM-порту ПК прямым кабелем.МКUART+3,3 ВTXDRXDRTSCTSMAX32321C1+3C1−4C2+5C2−16VCCGND15V+2V−611 DIN1DOUT1 1412 ROUT1RIN1 1310 DIN2DOUT2 79 ROUT2RIN2 8логика 0/3,3 Вуровни RS-232DE-9розетка, DCE2 RxD3 TxD8 CTS7 RTS5 GNDимена цепей —со стороны ПКC10,1 мкФC20,1 мкФ+3,3 ВC50,1 мкФC30,1 мкФC40,1 мкФобщий провод
Подключение микроконтроллера к COM-порту через MAX3232 при питании 3,3 В. Номера выводов — по даташиту TI, названия цепей разъёма — со стороны ПК.

Устройство на схеме разведено как DCE: передатчик МК через DOUT1 выходит на контакт 2 разъёма, приёмник слушает контакт 3. Тогда к COM-порту компьютера, а это DTE, подходит прямой кабель. Если поставить вилку и поменять контакты 2 и 3 местами, устройство станет DTE, и для связи с ПК понадобится нуль-модем. Второй канал MAX3232 передаёт RTS/CTS. Если управление потоком не нужно, вход DIN2 подключите к земле или питанию — TI требует, чтобы на всех входах DIN был допустимый логический уровень, — а выход ROUT2 оставьте свободным.

Если МК 3,3-вольтовый, а преобразователь — 5-вольтовый MAX232, его выход ROUT поднимается почти до 5 В (по даташиту TI — не ниже 3,5 В при токе 1 мА). Для входа МК без допуска 5 В это перегрузка: на линию ROUT → RXD нужен делитель напряжения или другой преобразователь уровня, а проще взять MAX3232 с питанием 3,3 В. В обратную сторону проблемы нет: вход передатчика MAX232 считает «1» уже от 2 В.

Инициализация UART на AVR

Пример для ATmega328P на 16 МГц: 9600 бит/с, формат 8N1, опрос флагов без прерываний. Значение UBRR и фактическая скорость:

UBRR=16 000 00016⋅9600−1≈103,2  →  103,BAUD=16 000 00016⋅104≈9615 бит/с.UBRR = \frac{16\,000\,000}{16 \cdot 9600} - 1 \approx 103{,}2 \;\to\; 103, \qquad BAUD = \frac{16\,000\,000}{16 \cdot 104} \approx 9615\ \text{бит/с}.

Ошибка +0,2 %, как в таблице выше.

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#define BAUD 9600UL
/* UBRR = F_CPU / (16 * BAUD) - 1, rounded to the nearest integer: 103 at 16 MHz */
#define UBRR_VALUE ((F_CPU + 8UL * BAUD) / (16UL * BAUD) - 1UL)

void uart_init(void)
{
    UBRR0H = (uint8_t)(UBRR_VALUE >> 8);
    UBRR0L = (uint8_t)UBRR_VALUE;
    UCSR0A = 0;                             /* U2X0 = 0: 16 samples per bit */
    UCSR0B = _BV(RXEN0) | _BV(TXEN0);       /* enable receiver and transmitter */
    UCSR0C = _BV(UCSZ01) | _BV(UCSZ00);     /* 8 data bits, no parity, 1 stop bit */
}

void uart_putc(uint8_t c)
{
    while (!(UCSR0A & _BV(UDRE0))) {}       /* wait for an empty transmit buffer */
    UDR0 = c;
}

uint8_t uart_getc(void)
{
    while (!(UCSR0A & _BV(RXC0))) {}        /* wait for a received byte */
    return UDR0;
}

Проверить порт можно без второго устройства: замкните контакты 2 и 3 разъёма DE-9 — каждый байт, отправленный uart_putc(), должен вернуться из uart_getc(). Подробнее о контроллерах AVR — в разделе AVR.

Типичные ошибки и отладка

  • Перепутаны TxD и RxD или DTE и DCE. Связи нет совсем. Проверьте напряжения на контактах 2 и 3 и тип кабеля — прямой или нуль-модем.
  • Нет общего провода. Без контакта 5 приёмнику не от чего отсчитывать уровни: связь пропадает или идёт с ошибками.
  • TTL вместо RS-232. Модуль с логическими уровнями подключён к COM-порту или наоборот: в лучшем случае мусор из-за инверсии, в худшем — сгоревший вывод МК.
  • Не та скорость или формат кадра. Вместо текста — мусор и ошибки кадра. Скорость, число бит данных, чётность и число стоп-битов должны совпадать на обеих сторонах.
  • Включено аппаратное управление потоком, а RTS и CTS не подключены. Терминал молчит: вход CTS выключен, и передача заблокирована. Отключите управление потоком или сделайте петли квитирования.
  • Ошибка частоты. 115 200 бит/с на AVR с кварцем 16 МГц, внутренний RC-генератор без калибровки — сбои, которые зависят от температуры и конкретного экземпляра.
  • Не работает насос преобразователя. Не те конденсаторы, плохая пайка, перепутана полярность: выходы не дотягивают до ±5 В. Проверьте напряжения на выводах V+ (2) и V− (6) — в типовой схеме TI для MAX232 это около +8,5 и −8,5 В.

Порядок проверки:

  1. Петля на разъёме. Замкните контакты 2 и 3, а при аппаратном управлении потоком ещё 7 с 8 и 4 с 6 и 1, и откройте порт в терминале: каждый набранный символ должен вернуться. Вернулся — порт и преобразователь исправны, ищите проблему в кабеле или у собеседника.
  2. Мультиметр. На выходе TxD в покое — от −5 до −15 В, на неподключённом входе RxD — около нуля. Постоянный плюс на TxD означает, что на входе передатчика логический ноль, — линия в состоянии break.
  3. Осциллограф. Видны уровни, фронты и длительность бита: 104 мкс при 9600 бит/с, 8,7 мкс при 115 200 бит/с. По самому короткому импульсу скорость определяют даже без документации.
  4. Логический анализатор — на стороне логики, между МК и преобразователем: там 0/3,3 В и неинвертированный сигнал, который понимает декодер UART.
  5. Терминал. Проверьте все параметры порта: скорость, 8N1, управление потоком «нет» — и что порт не занят другой программой.

Для длинных линий и сетей из многих устройств вместо RS-232 берут RS-485, для связи микросхем на одной плате — I²C.

Частые вопросы

Какая максимальная длина кабеля RS-232?

Стандарт ограничивает не длину, а ёмкость линии: не больше 2500 пФ вместе со входом приёмника. Texas Instruments оценивает это в 15–20 м в зависимости от кабеля, старая редакция RS-232-C рекомендовала кабель до 15 м. На скоростях выше 20 кбит/с практический предел — около 3 м. Для сотен метров нужен RS-485.

Какая распиновка разъёма DB9 (DE-9) у RS-232?

У компьютера и другого DTE: 1 — DCD, 2 — RxD (приём), 3 — TxD (передача), 4 — DTR, 5 — GND, 6 — DSR, 7 — RTS, 8 — CTS, 9 — RI. Для простой связи хватает контактов 2, 3 и 5. У DCE, например модема, те же контакты работают в обратную сторону: передаёт он по контакту 2.

Чем RS-232 отличается от UART с уровнями TTL?

UART формирует кадр: старт-бит, данные, бит чётности, стоп-биты. На его выводах логические уровни 0 и 3,3 или 5 В, в покое — высокий уровень. RS-232 передаёт тот же кадр напряжением ±5…±15 В и в инверсии: логическая «1» и покой — минус. Между ними ставят преобразователь уровней, например MAX3232.

Когда нужен нуль-модемный кабель?

Когда соединяются два DTE — например, два компьютера или компьютер и прибор с разъёмом-вилкой. Линии TxD и RxD нужно перекрестить, иначе передатчик попадёт на передатчик. Минимальный нуль-модем — три провода: 2–3, 3–2 и 5–5. Если устройства используют аппаратное управление потоком, накрест соединяют и RTS/CTS, и DTR с DSR.

Можно ли подключить RS-232 напрямую к Arduino или другому микроконтроллеру?

Нет. На линии RS-232 бывает до ±15 В, а вывод ATmega328P допускает напряжение от −0,5 В до напряжения питания плюс 0,5 В. К тому же сигнал RS-232 инвертирован. Нужен преобразователь уровней: MAX3232 при питании от 3 до 5,5 В или MAX232 при 5 В.

MAX232 или MAX3232 — что выбрать?

Для новых схем — MAX3232: питание от 3 до 5,5 В, конденсаторы по 0,1 мкФ, до 250 кбит/с и защита от разрядов ±15 кВ. MAX232 работает только от 5 В и требует конденсаторов по 1 мкФ. Цоколёвка у них одинаковая, но при замене одной микросхемы на другую конденсаторы нужно поменять.

Источники

  1. TIA-232-F. Interface Between Data Terminal Equipment and Data Circuit-Terminating Equipment Employing Serial Binary Data Interchange — стандарт TIA, октябрь 1997; первая редакция EIA RS-232 — 1962
  2. ITU-T V.24. List of definitions for interchange circuits between data terminal equipment (DTE) and data circuit-terminating equipment (DCE) — рекомендация ITU-T, редакция 02/2000
  3. ITU-T V.28. Electrical characteristics for unbalanced double-current interchange circuits — рекомендация ITU-T, редакция 03/1993
  4. EIA/TIA-574. 9-Position Non-Synchronous Interface Between Data Terminal Equipment and Data Circuit-Terminating Equipment Employing Serial Binary Data Interchange — стандарт, сентябрь 1990
  5. Texas Instruments. Interface Circuits for TIA/EIA-232-F (SLLA037A) — design notes, 2002
  6. Datapro. Electronic Industries Association (EIA) RS-232-C Interface Standard, report 2740 — обзор стандарта, 1991
  7. Datapro. ANSI EIA/TIA-232-E Interface Standard, report 2741 — обзор стандарта, 1995
  8. Black Box. Technical Reference: Pinouts for Serial Interfaces — справочник распиновок, 1997
  9. Perle Systems. IOLAN DS1/SDS1 DB9/DB25 Cable Pin-Outs
  10. Chipkin Automation Systems. RS-232 Serial Wiring & Handshaking Bypass for Modbus
  11. ITT Cannon. D Subminiature Connectors — каталог
  12. Maxim Integrated. Application Note 2141: Determining Clock Accuracy Requirements for UART Communications — 2003
  13. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — даташит, 2020; USART — глава 20
  14. AVR-LibC. <util/setbaud.h>: Helper macros for baud rate calculations
  15. Exar. ST16C550 UART with 16-byte FIFO's — даташит, ред. 5.01, 2005
  16. Ecma International. ECMA-48: Control Functions for Coded Character Sets — 5-е издание, 1991
  17. Texas Instruments. MAX232, MAX232I Dual EIA-232 Drivers/Receivers (SLLS047M) — даташит, 2014
  18. Maxim Integrated. MAX220–MAX249 +5V-Powered, Multichannel RS-232 Drivers/Receivers — даташит 19-4323, Rev 16
  19. Texas Instruments. MAX3232 3-V to 5.5-V Multichannel RS-232 Line Driver/Receiver (SLLS410N) — даташит, 2017
  20. Texas Instruments. MAX3232E Multichannel RS-232 Line Driver and Receiver With ±15-kV IEC ESD Protection (SLLS664C) — даташит, 2015
  21. Analog Devices. ADM3251E Isolated, Single-Channel RS-232 Line Driver/Receiver — даташит
  22. FTDI. FT232R USB UART IC Datasheet
  23. Silicon Labs. CP2102/9 Single-Chip USB to UART Bridge — даташит, Rev. 1.7
  24. WCH. CH340 USB to Serial Chip Datasheet (CH340DS1)