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

Наружные разъёмы материнской платы:

После́довательный порт (англ. serial port, COM-порт[1], англ. communications port) — название интерфейса стандарта RS-232[уточнить] в IBM PC. Порт называется «последовательным», так как информация через него передаётся по одному биту, последовательно бит за битом (в отличие от параллельного порта). Несмотря на то, что некоторые интерфейсы компьютера (например, Ethernet, FireWire и USB) тоже используют последовательный способ обмена информацией, название «последовательный порт» закрепилось за портом стандарта RS-232.

Назначение

[править | править код]

Наиболее часто для последовательного порта персональных компьютеров используется стандарт RS-232C. Ранее последовательный порт использовался для подключения терминала, позже — для модема или мыши. Сейчас он используется для соединения с источниками бесперебойного питания, для связи с аппаратными средствами разработки встраиваемых вычислительных систем, спутниковыми ресиверами, кассовыми аппаратами, программаторами, с приборами систем безопасности объектов, а также с многими прочими устройствами.

С помощью COM-порта можно соединить два компьютера, используя так называемый «нуль-модемный кабель» (см. ниже). Такой кабель использовался со времен MS-DOS для передачи файлов с одного компьютера на другой, в UNIX — для терминального доступа к другой машине, а в Windows (даже современной) — для отладчика уровня ядра.

Достоинством технологии является крайняя простота оборудования. Недостатком является низкая скорость, крупные разъёмы, а также зачастую высокие требования ко времени отклика ОС и драйвера и большое количество прерываний (одно на половину аппаратной очереди, то есть 8 байт).

Разъём DE-9, используемый для интерфейса RS-232

На материнских платах ведущих производителей (например, Intel) или готовых системах (например, IBM, Hewlett-Packard, Fujitsu Siemens Computers) для последовательного порта принято условное обозначение COM или RS-232.

Варианты разъёма COM-порта типа DE-9

Наиболее часто используются стандартизированные в 1969 году D-образные разъёмы: 9- и 25-контактные, (DE-9 и DB-25 соответственно). Раньше использовались также DA-31 и круглые восьмиконтактные DIN-8. Максимальная скорость передачи в обычном исполнении порта составляет 115 200 бод.

Актуальность

[править | править код]

Широко распространённый в IBM PC-совместимых компьютерах, интерфейс RS-232 не пригоден для развлекательных и офисных задач, зато широко используется в прикладных задачах, поэтому попытки избавиться в современных материнских платах от наследия старых интерфейсов обречены. Спецификация PC99 — один из безуспешных примеров нажиться[источник не указан 1952 дня] на масштабной замене «устаревшего» оборудования. Про неё пишут[источник не указан 1952 дня], что она «ныне устарела и представляет исключительно исторический интерес», а производство «устаревшего» оборудования процветает. В офисных и домашних компьютерах, где расстояния и помехи невелики, а скорость обмена востребована, RS-232 практически вытеснен интерфейсом USB.

Существуют стандарты на эмуляцию последовательного порта над USB и над Bluetooth (эта технология в значительной степени и проектировалась как «беспроводной последовательный порт»).

Тем не менее программная эмуляция данного порта широко используется и сегодня. Так, например, практически все мобильные телефоны эмулируют внутри себя классический COM-порт и модем для реализации тетеринга — доступа компьютера в Интернет через GPRS/EDGE/3G/4G оборудование телефона. При этом для физического подключения к компьютеру используется USB, Bluetooth или Wi-Fi[2].

Также программная эмуляция данного порта предоставляется «гостям» виртуальных машин VMWare и Microsoft Hyper-V, основная цель при этом — подключение отладчика уровня ядра Windows к «гостю».

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

Аппаратура

[править | править код]

Разъём имеет контакты:

DTR (Data Terminal Ready — готовность к приёму данных) — выход на компьютере, вход на модеме. Означает готовность компьютера к работе с модемом. Сброс этой линии вызывает почти полную перезагрузку модема в первоначальное состояние, в том числе бросание трубки (некоторые управляющие регистры выживают после такого сброса). В UNIX это происходит в случае, если все приложения закрыли файлы на драйвере последовательного порта. Мышь использует этот провод для получения питания.

DSR (Data Set Ready — готовность к передаче данных) — вход на компьютере, выход на модеме. Означает готовность модема. Если эта линия находится в нуле — то в ряде ОС становится невозможно открыть порт как файл.

RxD (Receive Data — приём данных) — вход на компьютере, выход на модеме. Поток данных, входящий в компьютер.

TxD (Transmit Data — передача данных) — выход на компьютере, вход на модеме. Поток данных, исходящих из компьютера.

CTS (Clear to Send — готовность передачи) — вход на компьютере, выход на модеме. Компьютер обязан приостановить передачу данных, пока этот провод не будет выставлен в единицу. Используется в аппаратном протоколе управления потоком для предотвращения переполнения в модеме.

RTS (Request to Send — запрос на передачу) — выход на компьютере, вход на модеме. Модем обязан приостановить передачу данных, пока этот провод не будет выставлен в единицу. Используется в аппаратном протоколе управления потоком для предотвращения переполнения в оборудовании и драйвере.

DCD (Carrier Detect — наличие несущей) — вход на компьютере, выход на модеме. Взводится модемом в единицу после установления соединения с модемом с той стороны, сбрасывается в ноль при разрыве связи. Аппаратура компьютера может издавать прерывание при наступлении такого события.

RI (Ring Indicator — сигнал вызова) — вход на компьютере, выход на модеме. Взводится модемом в единицу после обнаружения вызывного сигнала телефонного звонка. Аппаратура компьютера может издавать прерывание при наступлении такого события.

SG (Signal Ground — сигнальная земля) — общий сигнальный провод порта, не является общей землёй, как правило, изолирован от корпуса ЭВМ или модема.

В нуль-модемном кабеле используются две перекрещенные пары: TXD/RXD и RTS/CTS.

Исходно в IBM PC и IBM PC/XT аппаратура порта была построена на микросхеме UART 8250 фирмы National Semiconductor, затем микросхема была заменена на 16450, программно совместимой с предыдущими, но позволявшей использовать скорости вплоть до 115200 бит в секунду, затем появилась микросхема 16550, содержавшая двунаправленный FIFO буфер данных для снижения нагрузки на контроллер прерываний. В настоящее время включена в SuperIO микросхему на материнской плате вместе с рядом иных устройств.

Программный доступ к COM-порту

[править | править код]

COM-порты в операционной системе Unix (Linux) — это файлы символьных устройств. Обычно эти файлы располагаются в каталоге /dev и называются

  • ttyS0, ttyS1, ttyS2 и т. д. в Linux
  • ttyd0, ttyd1, ttyd2 и т. д. (или ttyu0, ttyu1, ttyu2 и т. д. начиная с версии 8.0) в FreeBSD
  • ttya, ttyb, ttyc и т. д. в Solaris
  • ttyf1, ttyf2, ttyf3 и т. д. в IRIX
  • tty1p0, tty2p0, tty3p0 и т. д. в HP-UX
  • tty01, tty02, tty03 и т. д. в Digital Unix
  • ser1, ser2, ser3 и т. д. в QNX

Для программного доступа к COM-порту необходимо открыть на чтение/запись соответствующий файл и сделать вызовы специальных функций tcgetattr (для того, чтобы узнать текущие настройки) и tcsetattr (чтобы установить новые настройки). Также может потребоваться сделать вызовы ioctl с определёнными параметрами. После этого при записи в файл данные будут отправляться через порт, а при чтении программа будет получать уже принятые данные из буфера COM-порта.

Устройства с именами «ttyxx» используются как серверные, то есть приложение, открывшее данное устройство, обычно ожидает входящего звонка от модема. Классическим таким приложением, используемым по умолчанию, является getty, которая ожидает входящего звонка, далее настраивает COM-порт в соответствии с файлами конфигурации, выводит туда "login: ", принимает имя пользователя и запускает как потомка команду «login ИмяПользователя», со стандартным вводом и выводом, перенаправленными в COM-порт. Эта команда в свою очередь запрашивает и проверяет пароль, и в случае успеха запускает (не как потомка, а вместо себя вызовом execve в том же процессе) default user shell, прописанный в файле /etc/passwd.

Эта технология исторически возникла в 1970-е годы, когда под ОС UNIX использовались компьютеры вроде PDP-11 (в СССР серия называлась СМ ЭВМ) или VAX, позволяющие подключение многих терминалов для работы многих пользователей. Терминалы — а значит, и весь интерфейс пользователя — при этом подключались через последовательные порты, с возможностью подключения вместо терминала модема и дальнейшего дозвона на компьютер по телефону. До сих пор в UNIX-подобных ОС существует терминальный стек, и обычно 3 реализации терминалов — последовательный порт, консоль текстового режима экрана+клавиатура, и «обратная петля» в один из открытых файлов управляющего приложения (так реализованы telnetd, sshd и xterm).

Клиентские устройства последовательного порта, предназначенные для совершения звонков вовне, в многих UNIX (не во всех) называются cuaxx.

Так как последовательный порт в UNIX доступен только через терминальный стек, он может быть управляющим терминалом для процессов и групп (посылать SIGHUP при разрыве связи от модема и SIGINT при нажатии Ctrl-C), на уровне ядра поддерживать редактирование последней введенной строки клавишами стрелочек, и т. д. Для отключения этой возможности с целью превращения устройства в «трубу» для потока байт необходимы вызовы ioctl.

С последовательными портами в Win32 работают как с файлами. Для открытия порта используется функция CreateFile. Портов может быть много, поэтому они обозначаются как COM1, COM2 и т. д. по порядку обнаружения драйверов соответствующих устройств. Первые 9 портов доступны в том числе как именованные каналы для передачи данных (доступны по именам «COM1», «COM2», …), такой метод доступа считается устаревшим. Рекомендуется ко всем портам обращаться как к файлам (по именам «\\.\COM1», «\\.\COM2»,… «\\.\COMx»).

Поиск PnP-имен устройств в системе осуществляется вызовом SetupDiGetClassDevs. В реестре существует раздел HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM, в котором отображаются имеющиеся в данный момент COM-порты.

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Parameters\Serial10000, 

где последнее значение «Serial10000» — уникальный номер для каждого нового добавленного в систему COM-порта, для второго — «Serial10001» и т. д.

Имеющийся драйвер COM.SYS поддерживает только 4 COM-порта, каждый из которых должен иметь свою линию прерываний. Для обслуживания COM-портов с общей линией прерывания необходимо воспользоваться драйвером SIO[3].

Нуль-модемный кабель

[править | править код]

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

Примечания

[править | править код]
  1. Используется только в терминологии ОС семейства Windows, исторически пришло из ОС MS-DOS и классического IBM PC.
  2. [https://web.archive.org/web/20130621141521/http://skp.samsungcsportal.com/integrated/popup/FaqDetailPopup.jsp?seq=333410&cdsite=ua_ru Архивная копия от 21 июня 2013 на Wayback Machine Что Такое Функция AllShare?]
  3. Установка платы COM порта в компьютер. Дата обращения: 25 августа 2010. Архивировано из оригинала 15 мая 2011 года.