Первоначально, когда появились персональные компьютеры , с ними пришло сразу несколько не бог весть каких мудрёных, но вполне успешно работавших в комплексе со всей остальной начинкой, портов или схемных интерфейсов. Словом порт обозначили способ передачи данных. Это как ячейка памяти. Только в оперативную память записывается информация и лежит там, пока она нужна какой-нибудь программе, пока программа её не обработает (или сама программа пока нужна на компьютере кому-нибудь).
Порт и память
То есть, программа прочитает данное из памяти в процессор, что-то с ним сделает, может быть получит из этой информации какие-то новые данные, которые запишет в другое место. Или само данное просто перепишет на другое место. Во всяком случае в памяти информация, которая однажды была записана может быть либо прочитана, либо стёрта. Ячейка получается как сундучок, стоящий у стенки. А вся память состоит из ячейки каждая ячейка имеет свой адрес. Точно как сундучки, стоящие в ряд у стенки в подвале скупого рыцаря.
Ну и порт можно себе представить тоже как ячейку. Только такая ячейка сзади имеет окошко, ведущее куда-то за стенку. Можно записать в неё информацию, а информация возьмёт, и улетит в окошко, хотя какое-то время будет находиться в ячейке так же, как и в обычной ячейке оперативной памяти.
Или наоборот, в ячейку-порт информация может «прилететь» из окошка. Процессор это увидит и прочтёт эту новую появившуюся информацию. И пустит её в дело — перепишет куда-то, пересчитает вместе с какими-то другими данными. Даже может записать её в другую ячейку. Или в другую ячейку-порт, тогда эта поступившая по первому порту информация может «улететь» в окошко второго порта, — ну это уж как распорядится процессор. Вернее, программа, которая в этот момент процессором командует и данные, записанные в памяти и приходящие из портов, обрабатывает.
Просто и красиво. Эти порты так и назвали сразу — порты ввода-вывода. Через одни из них данные отправляются куда-то, через другие — откуда-то принимаются.
Ну а дальше начинается движение по кругу. Вот есть одно устройство, и есть другое. И вот есть цепочка символов, каждый из которых состоит из отдельных двоичных битов, и эту цепочку нужно передать. Как передавать? Можно по линии из 8 проводочков сразу передавать по целому символу — один проводок = один бит, потом код другого, потом третьего, и так, пока не передашь всю цепочку.
А можно было разворачивать каждый бит не в пространстве (по проводочкам), а во времени: сначала передать один бит символа, потом второй и так восемь раз. Ясно, что во втором случае нужны какие-то дополнительные средства, чтобы символы так разворачивать во времени.
Параллельные и последовательные
И скорость передачи будет другая:
Получается, у каждого варианта свои плюсы, но и свои минусы.
- Сразу по восемь бит (то есть побайтно) передавать быстрее, но проводочков надо в восемь раз больше
- По одному биту передавать — нужно всего один информационный проводок, зато будет в 8 раз медленнее.
Вот и назвали в первом случае передачу параллельной, а во втором случае — последовательной.
Интерфейс портов
А вся система такой передачи — в одном случае так, в другом — этак, называется интерфейс . Один интерфейс параллельный, другой — последовательный. Почти одно и то же, порты, один параллельный, другой последовательный.
Чем понятие порт отличается от понятия «интерфейс»? В современной технике слова не только появляются, они растут и получают «образование». И как и у людей, могут становиться узкими специалистами, а могут стать «дилетантами». Вот такое типичное слово-дилетант — «интерфейс». Потому что оно — «каждой дыре затычка». Интерфейсы бывают:
А смысл слова — что-то между чем-то. Интер — между, фэйс — лицо. Красиво получилось, поэтому и везде употребляется. Например, пользовательский интерфейс системы Windows — это экранное лицо системы, предназначенное для общения с человеком.
И оно состоит из нарисованной на экране картинки + правила работы каждого элемента картинки (например, нажми на кнопочку на экране мышкой — она нажмётся) + правила реагирования каждого элемента и всей системы в целом + все аппаратные средства, участвующие в диалоге (мышь, клавиатура, экран) + все программы, обеспечивающие диалог как со стороны всей системы, так и со стороны отдельных устройств (драйверы).
Не упомянули только о человеке, но так как он тоже часть взаимодействия, то должен иметь знания и навыки работы в системе, а для этого существуют обучающие программы, справочные системы… И вот изо всего этого и встаёт красивое и ёмкое слово: интерфейс .
В нашей теме интерфейс обозначает вещи немного более простые.
Это аппаратные + программные средства передачи + правила передачи. Аппаратные — понятно. А вот программные средства на компьютерах и в современных средствах связи присутствуют всегда и везде. Даже бывает так: сначала на какой-то аппаратной базе создаётся нечто функциональное, которое выполняется не сразу, а с применением специально написанных программ . А программы все настраиваются.
И постепенно, по мере работы новой функции (или функционального блока), программы которые его «делают» — а они от аппаратных средств отличаются тем, что их можно легко настраивать — доводятся до какого-то состояния оптимальной настройки. Что уже больше и не надо настраивать. И тогда программу в новой версии функционального блока могут заменить на аппаратно выполненный заменитель программной части. Например, «зашить» оптимально работающую хорошо настроенную программу в постоянную память . Или придумать специальную логическую схему, которая выполнит точь-в-точь то же самое, что делала оптимально настроенная программа — не шарахаясь и не забывая иногда все свои полезные настройки.
Поэтому интерфейс такой часто и называют — программно-аппаратным .
Правила передачи нужны для того, чтобы на обоих концах взаимодействия одни и те же вещи понимались (и обрабатывались) одинаково. Мы говорим о передаче импульсов? Значит нужно, чтобы импульсы были строго одинаковыми.
Например, чтобы 1 битовый приходил в виде +12 или +15 вольт перепада напряжения от нуля. И чтобы была в виде прямоугольничка, или острого всплеска - пик которого обязательно был не меньше, ну, + 5 вольт, а верхнее ограничение вводить, допустим, не очень обязательно. Это потому, что при передаче импульсов на какие-то расстояния электрические сигналы имеют свойство ослабевать и «размазываться».
Если с одного конца отправят строго 12 вольт, то до другого может дойти 3 вольта, а это системой приёма может расцениться просто как шум в линии, и переданная информация будет потеряна.
Смысл импульсов тоже должен пониматься одинаково. А импульсы могут быть информационные , служебные, синхронизирующие. И вообще, например, не импульсы, а просто постоянное напряжение. Которое может использоваться на другом конце, как питание небольшого устройства.
А ещё должны одинаково пониматься и сами те самые проводочки, о которых шла речь в самом начале. Тут надо сказать сразу, такого, чтобы шёл один проводок, никогда не бывает. Даже к телефону подходят в кабеле два проводка, а в норме полагается, чтобы было в кабеле четыре. И у интерфейсов передачи данных всегда несколько проводников. Какие-то из них — информационные, какие-то — служебные. И именно это должно одинаково распознаваться на обоих концах взаимодействия. А проводочки распознаются как ? По цвету, если в кабеле и по местоположению, если в контактах подключения.
Порт слово простое и тоже не совсем однозначное. Но смысл сходный: то, что что-то грузит на что-то и куда-то отправляет. Или наоборот, то, что что-то принимает и что-то из него выгружает. Смысл почти тот же, что и программно-аппаратный интерфейс, но как-то лаконичнее. И строже, как на флоте («Вам скажут — не спорьте… а мы и не спорим…»). Только наши сигналы плывут не по морю, а по кабелю.
Распиновка разъёмов COM-порта
Распиновка никакой связи не имеет с распинанием, хотя, как проводки, вольно бегущие в одной оболочке кабеля, разбирают на стороны и жёстко припаивают к своим штырькам, сходно с распинанием. Штырёк, по-английски «pin», булавка, поэтому и распиновка, слово уже это компьютерно-связистский «проанглийский» жаргонизм. Означает — распайка проводов по штырькам на разъёме.
Форма разъёма, порядок проводков (штырьков) в нём, назначение каждого штырька, а также номиналы напряжений и смысл сигналов в каждом — это часть интерфейса. Обычно вся эта информация собирается в отдельный документ, называемый спецификацией порта. Такая простая и понятная табличка на одну страницу. В других разновидностях интерфейсов что-то такое может называться «протоколом». А здесь ещё просто называют «распиновкой» .
Последовательные порты COM
COM-порты компьютера, это связь компьютерного комплекса «дальнего действия». В отличие от параллельных портов и кабелей, ведших на «тяжёлые» устройства — принтеры, сканеры, Com-порты присоединяли к компьютеру «лёгкие» юниты — мышка, модем. Первые межкомьютерные интерфейсы (через «нуль-модем»). В дальнейшем, когда распространились локальные сети , а мыши стали подключаться по такому же разъёму, как и клавиатура — port ps/2 (пэ-эс-пополам) — com port как-то был подзабыт.
Возрождение пришло с появлением последовательного интерфейса USB. Вот и получилось движение по кругу. Теперь на USB можно встретить, кроме флешек, и мыши USB-шные, и USB-шные «клавы». Принтеры, сканеры модемы — вся периферия теперь на USB, забыла уже о толстых и солидных параллельных LTP — кабелях, которые необходимо было в обязательном порядке прикручивать с каждой стороны на 2 болта. А проводочков-то в этих USB — два сигнальных (собственно, канал один, один прямой сигнал, другой тот же — инверсный) и два — питание и корпус.
Прежних последовательных портов COM было несколько. Самый маленький — и самый востребованный 9-контактный порт (D9), к которому подключали большую чать устройств: мыши, модемы, нуль-модемные кабели. Контакты располагались в два ряда, 5 и 4 в ряд, получалась трапеция. Поэтому и название D9. На «маме» нумерация шла слева направо и сверху вниз:
1 2 3 4 5
Распайка COM-порта, port RS232, 9 контактов.
№ | Обозначение | Тип | Описание |
---|---|---|---|
1 | DCD | Вход | Высокий уровень от модема, когда он принимает несущую модема-партнёра |
2 | RxD | Вход | Входящие импульсы данных |
3 | TxD | Выход | Исходящие импульсы данных |
4 | DTR | Выход | Высокий уровень (+12В) показывает готовность компьютера к приёму данных. Подключённая мышь использовала этот контакт как источник питания |
5 | GND | Общий | Земля |
6 | DSR | Вход | Готовность к передаче данных устройством |
7 | RTS | Выход | Ответная готовность устройства — партнёра |
8 | CTS | Вход | Готовность к приёму данных от партнёра |
9 | RI | Вход | Сигнал информирования компьютера о входящем звонке, поступившим на модем из линии связи |
Наряду с параллельным портом COM-порт, или последовательный порт является одним из традиционных портов ввода-вывода компьютера, использовавшимся еще в первых ПК. Хотя в современных компьютерах COM-порт имеет ограниченное применение, тем не менее, информация о нем, возможно, будет полезной многим пользователям.
Последовательный порт, как и параллельный, появился задолго до появления персональных компьютеров архитектуры IBM PC. В первых персоналках COM-порт использовался для подсоединения периферийных устройств. Однако сфера его применения несколько отличалась от сферы применения параллельного порта. Если параллельный порт использовался в основном для подключения принтеров, то COM-порт (кстати, приставка COM – это всего лишь сокращение от слова communication) обычно применялся для работы с телекоммуникационными устройствами, такими, как модемы. Тем не менее, к порту можно подключить, например, мышь, а также другие периферийные устройства.
COM-порт, основные сферы применения:
- Подключение терминалов
- ~ внешних модемов
- ~ принтеров и плоттеров
- ~ мыши
- Прямое соединение двух компьютеров
В настоящее время сфера применения СОМ-порта значительно сократилась благодаря внедрению более быстрого и компактного, и, кстати, тоже последовательного, интерфейса USB. Почти вышли из употребления внешние модемы, рассчитанные на подключение к порту, а также «COM-овские» мыши. Да и редко кто теперь соединяет два компьютера при помощи нуль-модемного кабеля.
Тем не менее, в ряде специализированных устройств последовательный порт до сих используется. Можно найти его и на многих материнских платах. Дело в том, что по сравнению с USB COM-порт имеет одно важное преимущество – согласно стандарту последовательной передачи данных RS-232, он может работать с устройствами на расстоянии в несколько десятков метров, в то время как радиус действия кабеля USB, как правило, ограничен 5 метрами.
Принцип работы последовательного порта и его отличие от параллельного
В отличие от параллельного (LPT) порта, последовательный порт передает данные побитно по одной-единственной линии, а не по нескольким одновременно. Последовательности битов группируются в серии данных, начинающиеся стартовым битом и кончающиеся стоповым битом, а также битами контроля четности, использующимися для контроля ошибок. Отсюда происходит и еще одно английское название, которое имеет последовательный порт – Serial Port.
Последовательный порт имеет две линии, по которым передаются собственно данные – это линии для передачи данных от терминала (ПК) к коммуникационному устройству и обратно. Кроме того, существует еще несколько управляющих линий. Обслуживает Serial port специальная микросхема UART, которая способна поддерживать относительно высокую скорость передачи данных, достигающую 115 000 бод (байт/с). Правда, стоит отметить, что реальная скорость обмена информацией зависит от обоих коммуникационных устройств. Кроме того, в функции контроллера UART входит преобразование параллельного кода в последовательный и обратно.
Порт использует электрические сигналы сравнительного высокого напряжения – до +15 B и -15 В. Уровень логического нуля последовательного порта составляет +12 В, а логической единицы – -12 В. Такой большой перепад напряжений позволяет гарантировать высокую степень помехоустойчивости передаваемых данных. С другой стороны, используемые в Serial port высокие напряжения требуют сложных схемотехнических решений. Это обстоятельство также поспособствовало снижению популярности порта.
Последовательный интерфейс RS-232
Работа Serial port на ПК базируется на стандарте передачи данных для последовательных устройств RS-232. Этот стандарт описывает процесс обмена данными между телекоммуникационным устройством, например, модемом и компьютерным терминалом. Стандарт RS-232 определяет электрические характеристики сигналов, их назначение, длительность, а также размеры коннекторов и схему выводов для них. При этом RS-232 описывает лишь физический уровень процесса передачи данных и не касается используемых при этом транспортных протоколов, которые могут меняться в зависимости от используемого коммуникационного оборудования и программного обеспечения.
Стандарт RS-232 был создан в 1969 г, а его последняя версия, TIA 232, вышла в 1997 г. В настоящее время RS-232 считается устаревшим, однако большинство операционных систем до сих пор его поддерживает.
В современных компьютерах разъем Serial port представляет собой 9-штырьковый разъем типа «вилка» DB-9, хотя стандарт RS-232 описывает также разъем с 25–ю контактами – DB-25, который часто применялся на старых компьютерах. Разъем DB-9 обычно расположен на системной плате ПК, хотя в старых компьютерах он мог находиться на специальной мультикарте, вставляемой в слот расширения.
9- штырьковое гнездо DB-9 на материнской плате
Разъем DB-9 на кабеле подключаемого к порту устройства
В отличие от параллельного порта, разъемы с обеих сторон двустороннего последовательного кабеля идентичны. Помимо линий для передачи самих данных, порт содержит несколько служебных линий, по которым между терминалом (компьютером) и телекоммуникационным устройством (модемом) может передаваться управляющая информация. Хотя теоретически для работы последовательного порта достаточно лишь трех каналов – прием данных, передача данных и земля, практика показала, что наличие служебных линий делает связь более эффективной, надежной и, как следствие, более быстрой.
Назначение линий разъема Serial port DB-9 согласно RS-232 и их соответствие контактам разъема DB-25:
Контакт DB-9 | Английское название | Русское название | Контакт DB-25 |
1 | Data Carrier Detect | Несущая обнаружена | 8 |
2 | Transmit Data | Передаваемые данные | 2 |
3 | Receive Data | Принимаемые данные | 3 |
4 | Data Terminal Ready | Готовность терминала | 20 |
5 | Ground | Земля | 7 |
6 | Data Set Ready | Готовность передающего устройства | 6 |
7 | Request To Send | Запрос на отправку данных | 4 |
8 | Clear To Send | Передача данных разрешена | 5 |
9 | Ring Indicator | Индикатор звонка | 22 |
Конфигурирование и прерывания
Поскольку в компьютере может быть несколько последовательных портов (до 4), то в системе для них выделяется два аппаратных прерывания - IRQ 3 (COM 2 и 4) и IRQ 4 (COM 1 и 3) и несколько прерываний BIOS. Многие коммуникационные программы, а также встроенные модемы используют для своей работы прерывания и адресное пространство портов COM. При этом обычно применяются не реальные порты, а так называемые виртуальные порты, которые эмулируются самой операционной системой.
Как и в случае многих других компонентов материнской платы, параметры работы портов COM, в частности, значения прерываний BIOS, соответствующих аппаратным прерываниям, можно настроить через интерфейс BIOS Setup. Для этого используются такие опции BIOS, как COM Port, Onboard Serial Port, Serial Port Address, и т.п.
Заключение
Последовательный порт ПК в настоящее время не является широко используемым средством для ввода-вывода информации. Тем не менее, поскольку существует большое количество оборудования, прежде всего, телекоммуникационного назначения, созданного для работы с последовательным портом, а также благодаря некоторым достоинствам протокола последовательной передачи данных RS-232, последовательный интерфейс пока еще не следует списывать со счетов, как абсолютно устаревший рудимент архитектуры персонального компьютера.
THR
-
промежуточный регистр данных передатчика
(только для записи)
Данные, записанные в регистр, будут пересланы в выходной сдвигающий
регистр (когда он будет свободен), из которого поступят на выход при
наличии разрешающего сигнала CTS
. Бит 0 передается (и принимается)
первым. При длине посылки менее 8 бит старшие биты
игнорируются.
RBR
- буферный регистр принимаемых данных
(только для чтения) Данные,
принятые входным сдвигающим регистром помещаются в регистр RBR
,
откуда они могут быть считаны процессором. Если к моменту окончания приема
очередного символа предыдущий не был считан из регистра, фиксируется
ошибка переполнения. При длине посылки менее 8 бит старшие биты в регистре
имеют нулевое
значение.
DLL
-
регистр младшего байта делителя
частоты
.
DLM
- регистр старшего байта делителя частоты
. Делитель определяется по
формуле D=115200/V, где V - скорость передачи, бит/с. Входная частота
синхронизации 1 8432 МГц делится на заданный коэффициент, после чего
получается 16-кратная частота передачи
данных.
IЕR
-
регистр разрешения прерываний
. Единичное значение бита разрешает
прерывание от соответствующего
источника.
Назначение
бит регистра
IER
:
*
биты =0 - не
используются;
*
бит 3 - Mod_IЕ
- по изменению состояния модема (любой из линий
CTS, DSR, RI,
DCD
);
*
бит 2 - RxL_IЕ
- по обрыву/ошибке
линии;
*
бит 1 - TxD_IE
- по завершении
передачи;
*
бит 0 - RxD_IЕ
- по приему символа (в режиме FIFO - прерывание по
тайм-ауту).
IIR
- регистр идентификации прерываний и признака режима FIFO
(только
для чтения). Для упрощения программного анализа UART выстраивает
внутренние запросы прерывания по четырехуровневой системе приоритетов.
Порядок приоритетов (по убыванию): состояние линии, прием символа,
освобождение регистра передатчика, состояние модема. При возникновении
условий прерывания UART указывает на источник с высшим приоритетом до тех
пор, пока он не будет сброшен соответствующей операцией. Только после
этого будет выставлен запрос с указанием следующего источника. Ниже
описано назначение бит регистра
IIR
.
*
Биты - признак режима
FIFO:
11-режим FIFO
16550A;
10 - режим FIFO
16550;
00 -
обычный.
*
Биты - не
используются.
*
Бит 3 - прерывание по тайм-ауту приема в режиме FIFO (в буфере есть
символы для
считывания).
*
Биты - причина прерывания с наивысшим приоритетом (в обычном, не
FIFO-режиме):
11 - ошибка/обрыв линии, сброс выполняется чтением регистра состояния
линии;
10 - принят символ, сброс выполняется чтением
данных;
01 - передан символ (регистр THR
пуст), сброс выполняется записью
данных;
00 - изменение состояния модема; сброс выполняется чтением регистра
состояния
модема.
*
Бит 0 - признак необслуженного запроса прерывания (1 - нет запроса, 0 -
есть запрос).
В режиме
FIFO причину прерывания идентифицируют биты
.
*
О11 - ошибка/обрыв линии. Сброс выполняется чтением регистра состояния
линии.
*
010 - принят символ. Сброс выполняется чтением регистра данных
приемника
*
110 - индикатор тайм-аута (за 4-кратный интервал времени символа не
передано и не принято ни одного символа, хотя в буфере имеется, по крайней
мере, один). Сброс выполняется чтением регистра данных
приемника.
*
001 - регистр THR
пуст. Сброс выполняется записью
данных.
*
000 - изменение состояния модема (CIS, DSR, RI
или DCD
).
Сброс выполняется чтением регистра
MSR
.
FCR
- регистр управления FIFO
(только для записи). Ниже описано
назначение бит регистра
FCR
:
*
Биты - ITL
(Interrupt Trigger Level) - уровень заполнения
FIFO-буфера, при котором вырабатывается
прерывание:
00 - 1 байт (по
умолчанию);
01 - 4
байта;
10 - 8
байт;
11 - 14
байт.
*
Биты
зарезервированы.
*
Бит 3 - разрешение операций
DMA.
*
Бит 2 - RESETTF
(Reset Transmitter FIFO) - сброс счетчика
FIFO-передатчика (записью единицы; сдвигающий регистр не
сбрасывается).
*
Бит 1 - RESETRF
(Reset Receiver FIFO) - сброс счетчика
FIFO-приемника (записью единицы; сдвигающий регистр не
сбрасывается).
*
Бит 0 - TRFIFOE
(Transmit And Receive FIFO Enable) - разрешение
(единицей) режима FIFO для передатчика и приемника. При смене режима
FIFO-буферы автоматически
очищаются.
LCR
-
регистр управления линией
(настройки параметров канала). Ниже
описано назначение бит регистра
LCR
.
*
Бит 7 - DLAB
(Divisor Latch Access Bit) - управление доступом к
делителю
частоты.
*
Бит 6 - BRCON
(Break Control) - формирование обрыва линии (посылка
нулей) при
BRCON=1.
*
Бит 5 - STICPAR
(Sticky Parity) - принудительное формирование бита
паритета:
0 - контрольный бит генерируется в соответствии с паритетом выводимого
символа;
1 - постоянное значение контрольного бита: при EVENPAR
=1 - нулевое,
при EVENPAR
=0 -
единичное.
*
Бит 4 - EVENPAR
(Even Parity Select) - выбор типа контроля: 0 -
нечетность, 1 -
четность.
*
Бит 3 - PAREN
(Parity Enable) - разрешение контрольного
бита:
1 - контрольный бит (паритет или постоянный)
разрешен;
0 - контрольный бит
запрещен.
*
Бит 2 - STOPB
(Stop Bits) - количество
стоп-бит:
0 - 1
стоп-бит;
1 - 2 стоп-бита (для 5-битного кода стоп-бит будет иметь длину 1,5
бит).
*
Биты - SERIALDB
(Serial Data Bits) - количество бит
данных:
00 - 5
бит;
01-6
бит;
10 - 7
бит;
11 - 8 бит.
MCR
- регистр управления модемом
. Ниже описано назначение бит регистра
MCR
.
*
Биты =0 -
зарезервированы.
*
Бит 4 - LME
(Loopback Mode Enable) - разрешение режима
диагностики:
0 - нормальный
режим;
1 - режим диагностики (см.
ниже).
*
Бит 3 - IE
(Interrupt Enable) - разрешение прерываний с помощью
внешнего выхода OUT2
MSR.7
:
0 - прерывания
запрещены;
1 - прерывания
разрешены.
*
Бит 2 - OUT1C
(OUT1 Bit Control) - управление выходным сигналом 1
(не используется); в режиме диагностики поступает на вход
MSR.6
.
*
Бит 1 - RTSC
(Request To Send Control) - управление выходом
RTS
; в режиме диагностики поступает на вход
MSR.4
:
0 - активен
(-V);
1 - пассивен
(+V).
*
Бит 0 - DTRC
(Data Terminal Ready Control) - управление выходом
DTR
; в режиме диагностики поступает на вход
MSR.5
:
0 - активен
(-V);
1 - пассивен
(+V).
LSR
-
регистр состояния линии
(точнее, состояния приемопередатчика). Ниже
описано назначение бит регистра
LSR.
*
Бит 7 - FIFOE
(FIFO Error Status) - ошибка принятых данных в режиме
FIFO (буфер содержит хотя бы один символ, принятый с ошибкой формата,
паритета или обрывом). В не FIFO-режиме всегда
0.
*
Бит 6 - TEMPT
(Transmitter Empty Status) - регистр передатчика пуст
(нет данных для передачи ни в сдвиговом регистре, ни в буферных регистрах
THR
или
FIFO).
*
Бит 5 - THRE
(Transmitter Holding Register Empty) - регистр
передатчика готов принять байт для передачи. В режиме FIFO указывает на
отсутствие символов в FIFO-буфере передачи. Может являться источником
прерывания.
*
Бит 4 - BD
(Break Detected) - индикатор обрыва линии (вход
приемника находится в состоянии 0 не менее, чем время посылки
символа).
*
Бит 3 - FE
(Framing Error) - ошибка кадра (неверный
стоп-бит).
*
Бит 2 - РЕ
(Parity Error) - ошибка контрольного бита (паритета или
фиксированного).
*
Бит 1 - ОЕ
(Overrun Error) - переполнение (потеря символа). Если
прием очередного символа начинается до того, как предыдущий выгружен из
сдвигающего регистра в буферный регистр или в регистр FIFO, прежний символ
в сдвигающем регистре
теряется.
*
Бит 0 - DR
(Receiver Data Ready) - принятые данные готовы (в DHR
или FIFO-буфере). Сброс - чтением
приемника.
Индикаторы
ошибок - биты - сбрасываются после чтения регистра LSR
. В
режиме FIFO признаки ошибок хранятся в FIFO-буфере вместе с каждым
символом. В регистре они устанавливаются (и вызывают прерывание) в тот
момент, когда символ, принятый с ошибкой, находится на вершине FIFO
(первый в очереди на считывание). В случае обрыва линии в FIFO заносится
только один «обрывной» символ, и UART ждет восстановления и последующего
старт-бита. MSR
- регистр состояния модема. Ниже описано назначение
бит регистра
MSR
:
*
Бит 7 - DCD
(Data Carrier Detect) - состояние линии
DCD
:
0 - активна
(-V);
1 - пассивна
(+V).
*
Бит 6 - RI
(Ring Indicator) - состояние линии
RI
:
0 - активна
(-V);
1 - пассивна
(+V).
*
Бит 5 - DSR
(Data Set Ready) - состояние линии
DSR
:
0 - активна
(-V);
1 - пассивна
(+V).
*
Бит 4 - CTS
(Clear To Send) - состояние линии
CTS
:
0 - активна
(-V);
1 - пассивна
(+V).
*
Бит 3 - DDCD
(Delta Data Carrier Detect) - изменение состояния
DCD
.
*
Бит 2 - TERI
(Trailing Edge Of Ring Indicator) - спад огибающей
RI
(окончание
звонка).
*
Бит 1 - DDSR
(Delta Data Set Ready) - изменение состояния
DSR
.
*
Бит 0 - DCTS
(Delta Clear To Send) - изменение состояния
CTS
.
Признаки
изменения (биты ) сбрасываются по чтению
регистра.
SRC
-
рабочий регистр
(8 бит), на работу UART не влияет, предназначен для
временного хранения данных (в 8250
отсутствует).
В
диагностическом режиме
(при LМЕ=1
) внутри UART организуется
внутренняя
«заглушка»:
*
выход передатчика переводится в состояние логической
единицы;
*
вход приемника отключается;
*
выходы управления модемом переводятся в пассивное состояние (логический
ноль).
Переданные
данные в последовательном виде немедленно принимаются, что позволяет
проверять внутренний канал данных порта (включая сдвигающие регистры) и
отработку прерываний, а также определять скорость работы
UART.
Особенностью данного порта по сравнению с другими "последовательными" технологиями является факт отсутствия каких-либо временных требований между 2 байтами. Временные требования есть только между битами одного байта (включая старт, стоп и четность), величина, обратная временной паузе между битами одного байта, называется baud rate - скорость передачи. Также в этой технологии отсутствует понятие "пакет".
Другие "последовательные" технологии, такие, как X.25, USB или Ethernet, имеют понятие "пакет", и накладывают жесткие временные требования между всеми битами одного пакета.
По этой причине в терминологии Cisco IOS данный порт назывался async - в отличие от синхронных serial, т.е. X.25. По этой же причине модуль Windows , реализующий PPP поверх данного порта, называется AsyncMac.sys (в стандарте PPP отдельно описана реализация PPP, использующего понятие "пакет", над последовательным портом, этого понятия не имеющим).
Некоторые протоколы связи с индустриальным оборудованием налагают жесткие временные требования между байтами последовательного порта. Такие протоколы крайне сложны в реализации в многозадачных ОС со слабой поддержкой реального времени, такой, как Windows, и потому зачастую требуют MS-DOS и устаревшего ПО почти 20-летней давности на управляющем компьютере.
Назначение
Наиболее часто для последовательного порта персональных компьютеров используется стандарт RS-232C. Ранее последовательный порт использовался для подключения терминала, позже для модема или мыши . Сейчас он используется для соединения с , для связи с аппаратными средствами разработки встраиваемых вычислительных систем , спутниковыми ресиверами, кассовыми аппаратами, а также с приборами систем безопасности объектов.
С помощью COM-порта можно соединить два компьютера, используя так называемый «нуль-модемный кабель» (см. ниже). Использовался со времен MS-DOS для перекачки файлов с одного компьютера на другой, в UNIX для терминального доступа к другой машине, а в Windows (даже современной) - для отладчика уровня ядра.
Достоинством технологии является крайняя простота оборудования. Недостатком является низкая скорость, крупные размеры разъемов, а также зачастую высокие требования к времени отклика ОС и драйвера и высокое количество прерываний (одно на половину аппаратной очереди, т.е. 8 байт).
Разъемы
На материнских платах ведущих производителей (например, Intel) или готовых системах (например, IBM , Hewlett-Packard , Fujitsu Siemens Computers) для последовательного порта принято следующее условное обозначение:
Наиболее часто используются стандартизированные в 1969 году D-образные разъёмы: 9-ти и 25-ти контактные, (DB-9 и DB-25 соответственно). Раньше использовались также DB-31 и круглые восьмиконтактные DIN-8. Максимальная скорость передачи, в обычном исполнении порта, составляет 115 200 бод .
Актуальность
Существуют стандарты на эмуляцию последовательного порта над USB и над Bluetooth (эта технология в значительной степени и проектировалась как «беспроводной последовательный порт»).
Тем не менее программная эмуляция данного порта широко используется и сегодня. Так, например, практически все мобильные телефоны эмулируют внутри себя классический COM-порт и модем для реализации тетеринга - доступа компьютера в Интернет через GPRS/EGDE/3G оборудование телефона. При этом для физического подключения к компьютеру используется USB, Bluetooth или Wi-Fi .
Также программная эмуляция данного порта предоставляется «гостям» виртуальных машин VMWare и Microsoft Hyper-V , основная цель при этом - подключение отладчика уровня ядра Windows к «гостю».
Аппаратура
Разъем имеет контакты:
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) аппаратура порта называется UART 16550 (в настоящее время включена в SuperIO микросхему на материнской плате вместе с рядом иных устройств). Со времен IBM PC в ней появилась аппаратная очередь байт, которая сильно снижает количество издаваемых устройством прерываний.
Программный доступ к СОМ-порту
UNIX
Для каждого порта в реестре имеется раздел. Эти разделы имеют такие имена:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Serial\Parameters\Serial10000
где последнее значение “Serial10000” - уникальный номер для каждого нового добавленного в систему COM-порта, для второго – “Serial10001” и т.д
Для связи с устройствами, поддерживающими Bluetooth, некоторым программам (например, к таким программам относятся: программа, которая синхронизирует список контактов с мобильным телефоном; программа, которая извлекает координаты GPS из GPS-приемника) на компьютере пользователя требуется COM-порт.
К программам, использующим COM-порты для поддержки связи с помощью технологии беспроводного подключения Bluetooth, непосредственно разработанных фирмой Microsoft, относятся:
- HotSync, используемый в ручных компьютерах
- ActiveSync , используемый в карманных ПК
OS/2
Имеющийся драйвер COM.SYS поддерживает только 4 COM-порта, каждый из которых должен иметь свою линию прерываний. Для обслуживания COM-портов с общей линией прерывания необходимо воспользоваться драйвером SIO .
Нуль-модемный кабель
Основная статья: Нуль-модемный кабель
В некоторых случаях возможно применение упрощённого варианта кабеля, в котором задействуются только контакты 2, 3 и 5.
См. также
- Сигналы последовательных портов
Примечания
Ссылки
- Перевод руководства по программированию СОМ-порта в POSIX операционных системах
- Программирование порта на java - позволяет работать из Windows, в отличие от официальных пакетов от Sun.
- Программирование COM порта на C++ под Windows. Готовая библиотека, исходные тексты, примеры программ.
- Яшкардин В.Л. Последовательный порт. Программирование COM-порта в Windows и MS-DOS . SoftElectro (2009). Архивировано из первоисточника 8 февраля 2012.
UART | |||||||
---|---|---|---|---|---|---|---|
Физические уровни |
|
Вот мы и добрались до COM порта. Но с ним все не так просто как с LPT, и его полноценное использование потребует значительно больших усилий. Главной загвоздкой является и его главное преимущество - передача данных в последовательном виде. Если в LPT байт данных передается по 8-ми линиям по биту на каждую, и состояние каждой линии можно было легко посмотреть, то в COM порту байт данных передается бит за битом по одной линии (относительно земли, конечно) и посмотреть что там передается с помощью одних светодиодов не удастся. Для этого нужно специальное устройство - преобразователь потока последовательных данных в парраллельный, т.н. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Например, он есть в составе материнской платы компьютера, снабженного COM портом, в любом более мение серьезном микроконтроллере. |
Надеюсь, вы еще пали духом в освоении COM порта. Все не так уж и мрачно. Некоторые результаты можно получить и без USART. Сформулируем задачу, которую реализуем на начальном этапе работы с COM портом:
"Хочу что бы к компьютеру через COM порт подключался светодиод. Запускаю программу. Далаю какое-то действие в этой программе, светодиод загорается, делаю другое - светодиод тухнет."
Задача довольно специфичная (с учетом того, что USART не используется) и является чистой "самопальщиной", но вполне реализуема и работоспособна. Давайте приступим к ее реализации.
1. COM порт
Опять берем системный блок вашего ПК и смотрим в тыловую часть. Примечаем там 9-ти штырьковй разъем - это и есть COM порт. Реально их может быть неколько (до 4-х). На моем ПК установлено два COM порта (см. фото).
2. Удлинитель COM порта
3. Аппаратная часть
С аппаратной частью нам тоже придется "повозиться", в том смысле что она будет сложнее чем с первым устройством для LPT порта. Дело в том что протокол RS-232 по которому идет обмен данными в COM порту, имеет несколько отличное соотношение логическое состояние - напряжение. Если обычно это логический 0 0 В, логическая 1 +5 В, то в RS-232 это соотношение следующее: логический 0 +12 В, логическая 1 -12 В.
И например, получив -12 В не сразу понятно что с этим напряжением делать. Обычно проводят преобразование уровней RS-232 в ТТЛ (0, 5 В). Самый простой вариант - стабилитроны. Но я предлагаю сделать этот преобразователь на специальной микросхеме. Называется она MAX232.
Теперь давайте посмотрим, а какие сигналы из COM порта мы можем посмотреть на светодиодах? В действительности, в COM порту есть аж 6 независимых линий, представляющих интерес для разработчика устройств сопряжения. Две из них пока для нас недоступны - линии по передаче последовательных данных. А вот оставшиеся 4 предназначены для управления и индикации процесса передачи данных и мы сможем "передалать" их под свои нужды. Две из них предназначены для управления со стороны внешнего устройства и мы их пока трогать не будем, а вот последние две оставшиеся линии мы сейчас и поиспользуем. Они называются:
- RTS - Запрос на передачу. Линия взаимодействия, которая показывает, что компьютер готов к приему данных.
- DTR - Компьютер готов. Линия взаимодействия, которая показывает, что компьютер включен и готов к связи.
Сейчас мы немного передалаем их назначение, и светодиоды, подключенные к ним будут либо тухнуть либо загораться, в зависимости от действий в нашей собственной программе.
Итак, давайте соберем схему, которая позволит нам проводить задуманные действия.
А вот ее практичекая реализация. Я думаю вы меня простите, что я сделал ее в таком стремном макетном варианте, ибо делать плату для такой "высоко продуктивной" схемы не хочется.
4. Программная часть
Тут все попроще. Давайте создадим Windows приложение в Microsoft Visual C++ 6.0 на основе MFC для управления двумя линиями взаимодействия COM порта. Для этого создаем новый проект MFC и указываем ему имя, например, TestCOM . Далее выбираем вариант построения на основе диалога.
Придайте внешний вид окну диалога нашей программы, как на рис. ниже, а именно добавьте четыре кнопки, по две на каждую из линий. Одна из них соответственно необходима для того чтобы "погасить" линию, другая чтобы ее "установить" в еденицу.
Class CTestCOMDlg: public CDialog { // Construction public: CTestCOMDlg(CWnd* pParent = NULL); // standard constructor HANDLE hFile;
Чтобы наша программа могла упрявлять линиями COM порта, его надо сначала открыть. Напишем код, ответственный за открытие порта при загрузке программы.
HFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) { MessageBox("Не удалось открыть порт!", "Ошибка", MB_ICONERROR); } else { MessageBox("Порт успешно открыт", "Ok", MB_OK); }
С помощью стандарной функции Win API CreateFile() открываем COM-порт COM2 . Далее проверяем успешность открытия с выводом информационного сообщения. Вот тут надо сделать важное замечание: COM2 - это в моем компьютере, а на Вашем компьютере Вы могли подключить его к другому COM порту. Соответственно, его имя нужно изменить на то, кокай порт Вы используете. Посмотреть, какие номера портов присутствуют на Вашем компьютере, можно так: Пуск -> Настройка -> Панель управления -> Система -> Оборудование -> Диспетчер устройств -> Порты (COM и LPT) .
В итоге, функция CTestCOMDlg::OnInitDialog() , расположенная в файле TestCOMDlg.cpp , класса нашего диалога должна принять вид:
BOOL CTestCOMDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application"s main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) { MessageBox("Не удалось открыть порт!", "Оштбка", MB_ICONERROR); } else { MessageBox("Порт успешно открыт", "Ok", MB_OK); } return TRUE; // return TRUE unless you set the focus to a control }
Теперь добавим обработчики кнопок управления линиями. Я дал им соответствующие имена: функция, которая устанавливает еденицу на линии DTR - OnDTR1(), 0 - OnDTR0(). Для линии RTS соответственно аналогичным образом. Напомню, что обработчик создается при двойном щелчке на кнопке. В итоге, эти четыре функции должны принять вид:
Void CTestCOMDlg::OnDTR1() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 6); } void CTestCOMDlg::OnDTR0() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 5); } void CTestCOMDlg::OnRTS1() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 4); } void CTestCOMDlg::OnRTS0() { // TODO: Add your control notification handler code here EscapeCommFunction(hFile, 3); }
Поясню немного как они работают. Как видно, внитри себя они содержат вызов одной и той же Win API функции EscapeCommFunction() с двумя параметрами. Первый из них - это хэндл (HANDLE) на открытый порт, второй - специальный код действия, соответствующий необходимому состоянию линии.
Все, комилируем, запускаем. Если все хорошо, должны увидеть сообщение об успешном открытии порта. Далее, нажатием соответствующих кнопок мигаем светодиодами, подключенными к COM порту.
© Иванов Дмитрий
Декабрь 2006