• Последовательный порт com1. Что такое COM-порт

    Наряду с параллельным портом COM-порт, или последовательный порт является одним из традиционных портов ввода-вывода компьютера, использовавшимся еще в первых ПК. Хотя в современных компьютерах COM-порт имеет ограниченное применение, тем не менее, информация о нем, возможно, будет полезной многим пользователям.

    Последовательный порт, как и параллельный, появился задолго до появления персональных компьютеров архитектуры IBM PC. В первых персоналках COM-порт использовался для подсоединения периферийных устройств. Однако сфера его применения несколько отличалась от сферы применения параллельного порта. Если параллельный порт использовался в основном для подключения принтеров, то COM-порт (кстати, приставка COM – это всего лишь сокращение от слова communication) обычно применялся для работы с телекоммуникационными устройствами, такими, как модемы. Тем не менее, к порту можно подключить, например, мышь, а также другие периферийные устройства.

    COM-порт, основные сферы применения:

    1. Подключение терминалов
    2. ~ внешних модемов
    3. ~ принтеров и плоттеров
    4. ~ мыши
    5. Прямое соединение двух компьютеров

    В настоящее время сфера применения СОМ-порта значительно сократилась благодаря внедрению более быстрого и компактного, и, кстати, тоже последовательного, интерфейса 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, последовательный интерфейс пока еще не следует списывать со счетов, как абсолютно устаревший рудимент архитектуры персонального компьютера.

    Первоначально, когда появились персональные компьютеры , с ними пришло сразу несколько не бог весть каких мудрёных, но вполне успешно работавших в комплексе со всей остальной начинкой, портов или схемных интерфейсов. Словом порт обозначили способ передачи данных. Это как ячейка памяти. Только в оперативную память записывается информация и лежит там, пока она нужна какой-нибудь программе, пока программа её не обработает (или сама программа пока нужна на компьютере кому-нибудь).

    Порт и память

    То есть, программа прочитает данное из памяти в процессор, что-то с ним сделает, может быть получит из этой информации какие-то новые данные, которые запишет в другое место. Или само данное просто перепишет на другое место. Во всяком случае в памяти информация, которая однажды была записана может быть либо прочитана, либо стёрта. Ячейка получается как сундучок, стоящий у стенки. А вся память состоит из ячейки каждая ячейка имеет свой адрес. Точно как сундучки, стоящие в ряд у стенки в подвале скупого рыцаря.

    Ну и порт можно себе представить тоже как ячейку. Только такая ячейка сзади имеет окошко, ведущее куда-то за стенку. Можно записать в неё информацию, а информация возьмёт, и улетит в окошко, хотя какое-то время будет находиться в ячейке так же, как и в обычной ячейке оперативной памяти.

    Или наоборот, в ячейку-порт информация может «прилететь» из окошка. Процессор это увидит и прочтёт эту новую появившуюся информацию. И пустит её в дело — перепишет куда-то, пересчитает вместе с какими-то другими данными. Даже может записать её в другую ячейку. Или в другую ячейку-порт, тогда эта поступившая по первому порту информация может «улететь» в окошко второго порта, — ну это уж как распорядится процессор. Вернее, программа, которая в этот момент процессором командует и данные, записанные в памяти и приходящие из портов, обрабатывает.

    Просто и красиво. Эти порты так и назвали сразу — порты ввода-вывода. Через одни из них данные отправляются куда-то, через другие — откуда-то принимаются.

    Ну а дальше начинается движение по кругу. Вот есть одно устройство, и есть другое. И вот есть цепочка символов, каждый из которых состоит из отдельных двоичных битов, и эту цепочку нужно передать. Как передавать? Можно по линии из 8 проводочков сразу передавать по целому символу — один проводок = один бит, потом код другого, потом третьего, и так, пока не передашь всю цепочку.

    А можно было разворачивать каждый бит не в пространстве (по проводочкам), а во времени: сначала передать один бит символа, потом второй и так восемь раз. Ясно, что во втором случае нужны какие-то дополнительные средства, чтобы символы так разворачивать во времени.

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

    И скорость передачи будет другая:

    Получается, у каждого варианта свои плюсы, но и свои минусы.

    1. Сразу по восемь бит (то есть побайтно) передавать быстрее, но проводочков надо в восемь раз больше
    2. По одному биту передавать — нужно всего один информационный проводок, зато будет в 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 Вход Сигнал информирования компьютера о входящем звонке, поступившим на модем из линии связи

    Иногда приходится решать задачу связи электронного устройства с компьютером, будь то просто обмен данными или удалённое управление. Эта статья описывает, как это можно реализовать, используя последовательный порт. Главным его преимуществом является то, что стандартный программный интерфейс Windows (API) позволяет производить непосредственное управление выходными линиями, давая прямой контроль над ними, и имеет функцию ожидания некоторого события, связанного с COM-портом. Также стандарт RS-232, по которому выполнены COM-порты, допускает подключение и отключение кабелей во время работы устройств (hot plug).

    Описание

    COM-порт (последовательный порт) – двунаправленный интерфейс, передающий данные в последовательном виде (бит за битом) по протоколу RS-232. Это довольно-таки распространённый протокол, применяемый для связи одного устройства (например, компьютера) с другими посредством проводов длиной до 30м. Уровни логических сигналов здесь отличаются от стандартных: уровень логической единицы – от +5 до +15В, уровень логического нуля – от -5 до -15В, что требует дополнительных преобразований схемы, но обеспечивает хорошую помехоустойчивость.

    Рассмотрим 9-пинововый разъём (DB-9M). Ниже представлена его распиновка:

    № вывода Наименование Характер сигнала Сигнал
    1 DCD Входной Data carrier detect
    2 RxD Выходной Transmit data
    3 TxD Входной Receive data
    4 DTR Выходной Data terminal ready
    5 GND - Ground
    6 DSR Входной Data set ready
    7 RTS Выходной Request to send
    8 CTS Входной Clear to send
    9 RI Входной Ring indicator

    Больше всего нас будут интересовать пины 2 (передача данных),3 (приём данных) и 5 (земля). Это минимальный набор для возможности двухстороннего общения приборов.

    Подробно останавливаться на описании протокола не буду. Для этого есть ГОСТ’ы и т.п. Поэтому мы пойдём дальше и поговорим о том, как же управлять этим зверем.

    Применение

    Как уже говорилось, уровни ЛС RS-232 отличаются от стандартных уровней ТТЛ. Следовательно, нам необходимо как-то преобразовывать величины напряжений. Т.е. сделать 5В из +15В и 0В из -15В (и наоборот). Один из способов (и, наверное, самый простой) – использование специальной микросхемы MAX232. Она проста в понимании и одновременно может преобразовывать два логических сигнала.

    Ниже приведена схема её включения:


    Думаю, трудностей быть не должно. Это один из вариантов использования этой микросхемы: передача данных с микроконтроллера на ЭВМ и наоборот. Передаваемый сигнал поступает на ножки Tx IN с одной стороны и на Rx IN с другой. Входные сигналы снимаются с Tx OUT и Rx OUT соответственно.

    Программирование

    Для начала поговорим о программировании портов на низком уровне. Так будет более правильно. Я очень много нервов потратил, разбираясь с этим интерфейсом, пока не начал вникать в принцип его работы на более низком уровне, нежели простая передача символов. Если будет понятно это, значит и с языками высокого уровня проблем не будет.

    Ниже представлены адреса COM-портов, с которыми нам придётся работать:

    Название порта Адрес IRQ
    COM 1 3F8h 4
    COM 2 2F8h 3
    COM 3 3E8h 4
    COM 4 2E8h 3

    Они могут различаться. Установить значения можно в настройках BIOS’а. Это базовые адреса. От них же и будут зависеть адреса регистров, отвечающие за работу портов:

    Адрес DLAB Чтение/Запись Аббревиатура Название регистра
    + 0 =0 Write Transmitter Holding Buffer
    =0 Read Receiver Buffer
    =1 Read/Write Divisor Latch Low Byte
    + 1 =0 Read/Write IER Interrupt Enable Register
    =1 Read/Write Divisor Latch High Byte
    + 2 - Read IIR Interrupt Identification Register
    - Write FCR FIFO Control Register
    + 3 - Read/Write LCR Line Control Register
    + 4 - Read/Write MCR Modem Control Register
    + 5 - Read LSR Line Status Register
    + 6 - Read MSR Modem Status Register
    + 7 - Read/Write Scratch Register

    Первая колонка – адрес регистра относительно базового. Например, для COM1: адрес регистра LCR будет 3F8h+3=3FB. Вторая колонка – DLAB (Divisor Latch Access Bit) бит, определяющий разное назначение для одного и того же регистра.. Т.е. он позволяет оперировать 12-ю регистрами, используя всего 8 адресов. Например, если DLAB=1, то, обращаясь по адресу 3F8h, мы будем устанавливать значение младшего байта делителя частоты тактового генератора. Если же DLAB=0, то, обращаясь по тому же адресу, в этот регистр будет записан передаваемый или принятый байт.

    “Нулевой” регистр

    Ему соответствуют регистры приёма/передачи данных и установки коэффициента делителя частоты генератора. Как уже было сказано выше, если DLAB=0, то регистр используется для записи принимаемых/передаваемых данных, если же он равен 1, то устанавливается значение младшего байта делителя частоты тактового генератора. От значения этой частоты зависит скорость передачи данных. Старший байт делителя записывается в следующую ячейку памяти (т.е. для порта COM1 это будет 3F9h). Ниже приведена зависимость скорости передачи данных от коэффициента делителя:

    Interrupt Enable Register (IER)

    Если DLAB=0, то он используется как регистр управления прерываниями от асинхронного адаптера, если DLAB=1, то в нём задаётся старший байт делителя частоты тактового генератора.

    Interrupt Identification Register (IIR)

    Прерывание – это событие, при котором останавливается выполнение основной программы и начинается выполнение процедуры прерываний. Этот регистр определяет тип произошедшего прерывания.

    Line Control Register (LCR)

    Это управляющий регистр.

    Бит 7 1 Divisor Latch Access Bit – задание скорости обмена данными
    0 Обычнй режим (управление прерываниями, приём/передача данных)
    Бит 6 Имитировать обрыв линии (посылает последовательность из нескольких нулей)
    Биты 3 – 5 Бит 5 Бит 4 Бит 3 Выбор чётности
    X X 0 No Parity
    0 0 1 Odd Parity
    0 1 1 Even Parity
    1 0 1 High Parity (Sticky)
    1 1 1 Low Parity (Sticky)
    Бит 2 Кол-во стоп-битов
    0 1 стоп-бит
    1 2 стоп-бита при 6,7 или 8 бит данных или 1.5 стоп-бита при 5 битах данных.
    Биты 0 And 1 Бит 1 Бит 0 Число битов данных
    0 0 5 бит
    0 1 6 бит
    1 0 7 бит
    1 1 8 бит

    Проверка чётности подразумевает под собой передачу ещё одного бита – бита чётности. Его значение устанавливается таким образом, чтобы в пакете битов общее количество единиц (или нулей) было четно или нечетно, в зависимости от установки регистров порта. Этот бит служит для обнаружения ошибок, которые могут возникнуть при передаче данных из-за помех на линии. Приемное устройство заново вычисляет четность данных и сравнивает результат с принятым битом четности. Если четность не совпала, то считается, что данные переданы с ошибкой.

    Стоп-бит означает окончание передачи данных.

    Modem Control Register (MCR)

    Регистр управления модемом.

    Бит Значение
    0 Линия DTR
    1 Линия RTS.
    2 Линия OUT1 (запасная)
    3 Линия OUT2 (запасная)
    4 Запуск диагностики при входе асинхронного адаптера, замкнутом на его выход.
    5-7 Равны 0

    Line Status Register (LSR)

    Регистр, определяющий состояние линии.

    Бит Значение
    0 Данные получены и готовы для чтения, автоматически сбрасывается при чтении данных.
    1 Ошибка переполнения. Был принят новый байт данных, а предыдущий ещё не был считан программой. Предыдущий байт потерен.
    2 Ошибка чётности, сбрасывается после чтения состояния линии.
    3 Ошибка синхронизации.
    4 Обнаружен запрос на прерывание передачи "BREAK" – длинная строка нулей.
    5 Регистр хранения передатчика пуст, в него можно записать новый байт для передачи.
    6 Регистр сдвига передатчика пуст. Этот регистр получает данные из регистра хранения и преобразует их в последовательный вид для передачи.
    7 Тайм-аут (устройство не связано с компьютером).

    Modem Status Register (MSR)

    Регистр состояния модема.

    Ну вот и всё. Оперируя этими регистрами, можно напрямую общаться с COM-портом, управлять передачей и приёмом данных. Если вам не хочется возиться с памятью, можно воспользоваться уже готовыми компонентами для различных сред программирования: C++, VB, Delphi, Pascal и т.д. Они интуитивно понятны, поэтому, думаю, здесь не стоит заострять на них внимание.

    Последовательный порт это устройства ввода-вывода (I/O device). Как устройство I/O это только путь для передачи данных из компьютера и в него. существует также множество других устройств ввода-вывода, таких как последовательные порты, паралельные порты, контроллеры дисков, сетевые карты, устройства универсальной последовательной шины USB, и т.п. Большинство компьютеров имеют один или два последовательный порта . Какждый имеет 9-ти контактный разъем (иногда 25-ти контактный) (рис.1) на задней стенке системного блока компьютера. Программы могут отсылать данные (байты) через контакт отправки данных (output) и получать байты через другой контакт приема данных (input). Все остальные контакты служат для управления и земли.

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

    Большинство электронных компонентов последовательного порта сосредоточено в одно компьютерном чипе (микросхеме) называемом UART .

    Контакты и провода

    Старые компьютеры используют 25-ти контактные разъемы, но только 9 контактов реально задействовано на сегодняшний день. Каждый из 9-ти контактов соединен обычно с проводом. за исключением двух проводов для передачи и приема данных, остальные используются для контроля и земли. Напряжение на каждом из контактов и проводов измеряется относительно сигнальной земли. Поэтому минимальное количество проводом для двунаправленной передачи данных - 3. В редких случаях для работы может хватитть и двух проводов (без сигнальной земли), однако это может привести к низкой производительности, и иногда к ошибкам при передаче данных.

    Остается еще несколько проводов, которые предназначены только для управления (контроля) и не используются для передачи данных. Все эти сигналы могли бы передаваться по одной линии, но вместо этого, для выделены отдельные провода. Некоторые (или все вместе) эти сигнальные линии называются "линии состояния модема". Линии состояния могут находиться в одном из двух состояний установленном (включено) +12 вольт или сброшенном (выключено) -12 вольт. Одни из этих проводов сигнализируют компьютеру о том, что нужно прекратить передачу данных через последовательный порт. Другие в свою очередь сигнализируют устройству, подключенному к последовательному порту, прекратить передачу даных в компьютер. Если подключенно устройство это модем, то оставшиеся линии могут указывать модуме на то, что нужно занять телефонную линию или сигнализируют компьютеру о том, что соединение было установлено или что есть звонок на телефонной линии (значит кото-то соединиться с компьютером). Смотрите раздел Контакты и сигналы с более полной информацией.

    RS-232 или EIA-232, и т.п.

    Последовательный порт (serial port ) (не путать с USB) обычно соответствует стандарту RS-232-C , EIA-232-D , или EIA-232-E . Это три обозачения одного и тоже. Основной стандарт RS (рекомендованный стандарт - Recommended Standard) получил префикс EIA (Electronics Industries Association) и позднее EIA/TIA после того как организация EIA было объединена с TIA (Telecommunications Industries Association). Спецификация EIA-232 также охватывает синхронную передачу данных, но в большинстве случаев синхронная передача данных не поддерживается чипами в компьютерах. Обозначение RS устарело, однако до сих пор широко используется. EIA будет использоваться далее на этом сайте более часто. Некоторые документы используют полное обозначение EIA/TIA.

    Обмен данными (Скорости передачи данных)

    Данные (байты из которых состоят письма, картинки и т.п.) проходят через последовательный порт. Скорости передачи данных (такие как 56k (56000) бит/сек) называются (неверно) "скоростью". Большинство людей неверно говорят "скорость" вместо "коэффициент скорости".

    Важно знать, что средняя скорость передачи данных зачастую меньше максимально заявленной. Задержки (или периоды ожидания) и в результате скорость становится меньше. Эти задержки могут увеличиваться в щависимости от типа контроля передачи данных. Даже в лучшем случае всегда есть задержки между байтами, пусть даже и небольшие (несколько микросекунд). Если устройство, соединенное с компьютером через последоватльный порт не может работать на полной скорости, то средняя скорость должна быть уменьшена.

    Контроль передачи данных

    Контроль передачи данных означает возможность ограничить поток передачи данных через последовательный порт. Для последовательного порта это означает возможность остановить и потом возобновить передачу данных без потери байтов.

    Вот мы и добрались до 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