Сигналы квитирования (RTS, CTS итп) и RS232 вообще
У стандартного модемного интерфейса (rs232) кроме линий RxD и TxD есть еще куча разных, их называют “сигналами квитирования”. Я всегда путался в них — во всех этих RTS’ах, CTS’ах и прочих DSR’ах. В этой статье, я попробую систематизировать и кратко описать эти сигналы.
Итак, первое что стоит знать – интерфейс rs232 соединяет два типа устройств
-
DTE (Data Terminal Equipment) – это обычно компьютер или заменяющее его устройство. Для простоты, дальше я DTE буду называть компьютер. На компьютер устанавливается разъем типа “папа”
-
DCE (Data Circuit-terminating Equipment) – это обычно модем, или его заменяющее оборудование. Для простоты я буду называть DCE модемом. На DCE устанавливается разъем типа “мама”
Сигналы я буду описывать на примере 9-контактного разъема, так как он самый распространенный. Взглянем на него.
Как видно, контакты на разъемах перевернуты. Таким образом, прямой провод соединит контакты с одинаковыми номерами, тоесть, к примеру, контакту 2 на “папе” будет соответствовать контакт 2 на “маме”.
А вот и сводная табличка сигналов. Под названием вывода – номер его штырька в 9-контактном разъеме.
Сигналы, которыми управляет компьютер | Сигналы, которыми управляет модем |
Передача данных компьютером, прием модемом | TxD 3 |
||
RxD 2 |
Передача данных модемом, прием компьютером | ||
Компьютер готов передавать данные, либо компьютер разрешает модему передавать данные | RTS 7 |
||
CTS 8 |
Модем разрешает компьютеру передавать данные | ||
DSR 6 |
Готовность модема к работе. | ||
Готовность компьютера к работе. | DTR 4 |
||
RI 9 |
Индикатор звонка | ||
DCD 1 |
Индикатор наличия несущей. Устанавливается после соединения. | ||
Земля | SG 5 |
SG 5 |
Земля |
Ну, и немного подробнее опишем каждый сигнал.
Я буду рассматривать сигналы обычных логических уровней – так, как они выглядят на выходах или входах микроконтроллера.
Сигналы в кабеле (после преобразователя уровня, к примеру max232) перевернуты и уровни сдвинуты. Так, логической 1 на выходе контроллера соответствуют уровни напряжения от –3 до –15 вольт, а логическому нулю – +3…+15 вольт.
TxD (Tramsmit Data)
Сразу скажу, что откуда в сокращении буква “x” – я не знаю.
По этой линии происходит передача данных от компьютера к модему. По умолчанию на ней — высокий уровень. Прием байта начинается по стартовому биту (а точнее, по переходу линии из высокого состояния в низкое). Стартовый бит всегда является логическим нулем.
Далее, передаются данные. Обычно это 8 бит, хотя бывает и по другому. Данные передаются младшим битом вперед и в прямой логике (нулю на ножке контроллера соответствует принятый нулевой бит).
После этого идет не обязательный бит четности (на картинке его нет). Бит четности дополняет количество единиц до четного (even) или нечетного (odd). К примеру, если в байте было 3 единицы и четность установлена как “even”, то бит четности будет равен 1, чтобы дополнить количество единиц до четырех – четного числа. Четность служит для проверки правильности передачи байта.
После бита четности идет один, один с половиной или два стоп-бита. Стоп бит используется, чтобы правильно отработался старт-бит (чтобы между байтами всегда был перепад из высокого уровня в низкий). Это бит всегда установлен в логическую 1.
К примеру, передача 0xEE будет выглядеть на линии UART’а так:
Параметры последовательного порта обычно пишут так – “9600, 8N1”. 9600 – это скорость передачи бит/с, 8 – количество бит данных в посылке, N – бит четности не используется (может быть E или O, если используется), 1 – один стоп бит.
Заметьте, что количество передаваемых байт в секунду зависит не только от скорости передачи, но и от формата байта. К примеру, один байт в формате 8N1 занимает 10 бит (стартовый + 8 бит данных + стоповый), а в формате 8E1 уже 11бит – добавляется бит четности. Соответственно, байтовая скорость при битовой 9600бод станет 960байт/с в первом случае и 872.7байт/с во втором.
RxD (Receive Data)
Тоже самое, что и TxD, только хозяин этой линии – модем.
CTS (Clear To Send)
Рассмотрим такую ситуацию – компьютер отправляет модему большое количество данных на скорости 38400 бод, а модем подключен к другому модему на скорости 9600 бод.
Буфер внутри модема быстро заполняется, и, для того, чтобы он не переполнился, модем должен сообщить компьютеру “прекрати передачу!”. Для этого и служит линия CTS.
Активный уровень CTS – низкий. Тоесть, модем разрешает передачу данных, когда на ножке контроллера 0.
Пример из руководства по LPC17xx.
Как видно, компьютер передавал данные, пока на ножке был ноль. Когда появился высокий уровень, компьютер закончил передавать текущий байт и остановился.
RTS (Request To Send)
Вот с этой ножкой неразбериха. Проблема в том, что на месте этой ножки по стандарту могут быть два сигнала – RTS (номер цепи по стандарту — 105) и RTR (номер 133).
RTS (Ready To Send) – компьютер сигнализирует модему о том, что он сейчас будет передавать данные. Модем должен приготовиться и активировать CTS, после чего компьютер начинает передавать данные.
RTR (Ready To Receive) – компьютер сообщает модему о том, что он готов принимать данные. Это – аналог CTS, только со стороны компьютера.
Сейчас основная часть оборудования использует RTS как RTR! И даже аппаратное квитирование у LPC17xx, LPC2xxx, AT91SAM7 реализует именно механизм RTR.
Активный уровень как и у CTS – низкий.
Рассмотрим механизм подробнее на примере из руководства по LPC17xx
Сначала — сигнал RTS – низкий, принимаются байты.
Как только буфер приемника заполнился N символами, RTS переходит в высокое состояние, что запрещает модему передавать данные. Но, как видно, модем не успел среагировать на RTS и передал еще один байт, поэтому очень важно оставлять в буфере запас для как минимум одного байта.
Далее, байты читаются, и, когда их количество в буфере становится равным M, RTS возвращается в низкое состояние (разрешает модему передавать данные).
Подробнее про RTS/CTS — https://en.wikipedia.org/wiki/RS-232_RTS/CTS#RTS.2FCTS_handshaking
DTR (Data Terminal Ready)
Сигнал от компьютера к модему, обозначающий, что компьютер включен и котов к работе с модемом. Активное состояние, как обычно, низкое. Тоесть, если на ножке контроллера 0, то модем должен подготовиться к подключению к линии. Если-же компьютер выставит на этой ножке логическую 1, то модем обязан отключиться от линии (положить трубку, к примеру)
DTR также часто использовался как источник питания для внешнего малопотребляющего оборудования (к примеру, для мышки).
Подробнее: https://en.wikipedia.org/wiki/Data_Terminal_Ready
DSR (Data Set Ready)
Сигнал от модема к компьютеру. Говорит о том, что модем включен, проинициализирован, и готов к общению с компьютером. До тех пор, пока этот сигнал не активен нет смысла передавать что-либо в модем. Модем готов, когда на ножке контроллера логический 0.
RI (Ring Indicator)
Сигнал от модема к компьютеру. Как не сложно догадаться, этот сигнал дергается, когда на модем звонят. Скорость переключения сигнала – маленькая, порядка секунд, сигнал довольно точно повторяет огибающую звонка (огибающую того, что вы слышите, когда звонит аналоговый телефон).
На практике, этот сигнал используется редко. Обычно программа просто ждет сообщения “RING” от модема.
Логический 0 на ножке контроллера значит, что идет вызов.
подробнее: https://en.wikipedia.org/wiki/Ring_Indicator
DCD (Data Carrier Detect)
Сигнал от модема к компьютеру. Сообщает компьютеру о том, что модем подключен к удаленному модему. Эта ножка – очень важна, так как дает возможность определить спонтанные отключения.
Логический 0 означает, что связь между модемами активна.
подробнее: https://en.wikipedia.org/wiki/Data_Carrier_Detect
Теперь кратко про кабель
Теперь про кабель. Стандарт определяет максимальную емкость кабеля как 2.5нФ. Это, примерно, 25метров.
Однако, на практике, это ограничение игнорируют, так как целостность сигнала определяется не только емкостью но и скоростью. Вот максимальные длинны, используемые на практике для низких скоростей.
Скорость (бод) | Длинна экранированного кабеля, метры | Длинна неэкранированного кабеля, метры |
110 | 1500 | 300 |
300 | 1200 | 300 |
1200 | 900 | 150 |
2400 | 600 | 150 |
4800 | 150 | 75 |
9600 | 75 | 30 |
Стандарт
Если у вас остались какие-то вопросы, то лучше обратиться непосредственно к стандарту. как оказалось, найти его довольно сложно, поэтому выкладываю еще и у себя.
Супер!
Я видел много(достаточно) блогов по МК и электронике в целом — но описание стандарта RS-232 я вижу чуть ли не впервые!
Ой, как я когда-то путался в этих сочетаниях «+/-» * «активный/неактивный» * «0/1″…
«К примеру, если в байте было 3 единицы и четность установлена как “even”, то бит четности будет равен 1, чтобы дополнить количество единиц до четырех – четного числа» Опечатка наверное? even это нечетный. По идее тут должно быть odd