COM-порт. Сопряжение устройств с ПК. Программирование. Соединение через COM

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

В системе «Орион» интерфейс RS-232 используется для подключения пульта контроля и управления «С2000»/«С2000М» к СОМ-порту компьютера с установленным на нем АРМ «Орион»/«Орион Про».
В системах, допускающих работу под управлением АРМ «Орион»/«Орион Про» без резервирования пультом «С2000»/«С2000М» (например, в системах охранной сигнализации или контроля доступа), интерфейс RS-232 используется для подключения преобразователя интерфейса «С2000-ПИ» или «ПИ-ГР» к СОМ-порту компьютера. К преобразователю, в свою очередь, подключаются приборы системы «Орион» по интерфейсу RS-485. RS-232 имеет следующие ограничения: максимальная длина – 15 м и соединение только типа «точка-точка», т.е. непосредственно подключить несколько пультов к одному СОМ-порту нельзя.
В простейшем случае к компьютеру подключается только один пульт. Эта схема приведена на рис.

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

ВНИМАНИЕ! Во избежание гальванической связи между компьютером и приборами пульт, повторитель и приборы нельзя подключать к одному источнику питания. Питание на пульт и «С2000-ПИ» должно подаваться от отдельного источника.
Пульту должен быть присвоен сетевой адрес, и установлен режим «КОМПЬЮТЕР» для работы по интерфейсу RS-232.

С помощью преобразователей интерфейсов RS-232/RS-485 с автоматическим переключением приема/передачи (например, «С2000-ПИ») можно подключить несколько пультов к одному СОМ-порту компьютера. Один преобразователь следует подключить к СОМ-порту компьютера, остальные - к пультам по интерфейсу RS-232, а затем объединить преобразователи по интерфейсу RS-485 (см. схему на рис. 73). Кроме того, преобразователи обеспечат гальваническую изоляцию компьютера от пультов и приборов.
Для работы по интерфейсу RS-232 каждому пульту нужно задать уникальный сетевой адрес и режим «КОМПЬЮТЕР».
При использовании АРМ «Орион» к одному СОМ-порту можно подключить до 127 устройств. Либо это будет один пульт «С2000»/ «С2000М» и до 126 приборов, схема как на рисунках выше. Либо это будет несколько пультов с подключёнными приборами, как на рис.

При этом общее количество и пультов, и приборов не должно превышать 127. В такой системе все приборы и пульты должны иметь уникальные сетевые адреса от 1 до 127, т.е. адреса приборов, подключенных к разным пультам, не должны пересекаться.
При использовании АРМ «Орион Про» к каждому COM-порту можно подключить либо до 127 приборов (приборы подключаются через преобразователи интерфейсов «ПИ-ГР», «С2000-ПИ» или «C2000 USB»), либо до 127 пультов «С2000» или «С2000М». К каждому пульту при этом можно подключить до 127 приборов. При организации системы по второму варианту компьютер опрашивает не приборы, а пульты. Пульты, в свою очередь, опрашивают подключённые к ним приборы. Каждому пульту должен быть задан сетевой адрес (от 1 до 127). Адресация приборов в системе имеет 3 уровня (номер COM-порта, адрес пульта, адрес прибора), поэтому адреса приборов, подключённых к разным пультам, могут пересекаться, как и адреса пультов, подключённых к разным COM-портам компьютера. Максимальное количество устройств, подключаемых к одному компьютеру с «Оперативной задачей Орион Про», на сегодняшний день составляет 1024.
Как уже было сказано, такая схема применяется в случае, если к COM-порту нужно подключить несколько устройств. На текущий момент АРМ «Орион» поддерживает только один СОМ-порт. АРМ «Орион Про» поддерживает до 20 физических СОМ-портов и до 127 виртуальных СОМ-портов. При использовании АРМ «Орион Про» каждый пульт можно подключать к своему COM-порту (используя схему с гальванической изоляцией или без).

В настоящее время не все компьютеры имеют СОМ-порт. Для решения задачи подключения приборов системы «Орион» к компьютеру с АРМ можно применить USB-COM преобразователи, например, «USB-RS485», а также PCI-плату расширения портов. Основные достоинства данных PCI-плат:

  • возможность использовать до 8 COM-портов;
  • поддержка интерфейса RS-232/RS-485.

Специалистами компании «Болид» была протестирована плата расширения COM-портов MOXA CP 118U. Она позволяет подключать приборы по интерфейсу RS-485 напрямую к ПК с АРМ «Орион Про» (без использования преобразователя интерфейса), а также подключать несколько пультов (каждый к своему СОМ-порту).

Подключение приборов к компьютеру через пульты «С2000»/«С2000М» позволяет б|ольшую часть функций управления приборами переложить с АРМ на пульты. Здесь важно учитывать, что каждый пульт может управлять только подключёнными к нему приборами, поэтому взаимодействие приборов, подключённых к разным пультам, возможно только через АРМ. При неисправности компьютера каждый пульт будет управлять подключёнными к нему приборами в соответствие с запрограммированной в нем базой данных. То есть система распадается на несколько независимых подсистем.

Полученные от приборов сообщения сохраняются в кольцевом энергонезависимом буфере пультов, объем которого составляет 8000 событий (для «С2000М» вер.3.0х). При восстановлении работы компьютера эти сообщения будут вычитаны АРМ.

Допустим, в системе используется несколько приборов «С2000-КДЛ», релейных блоков «С2000-СП1», клавиатур «С2000-К» и блоков индикации «С2000-БИ». Причём из-за ограниченного размера базы данных пульта требуется использовать несколько пультов «С2000»/«С2000М». Каждый пульт организует взаимодействие только подключённых к нему приборов. В частности, он позволит отображать на блоках индикации состояния своих разделов, управлять этими разделами с клавиатур и с самого пульта, автоматически управлять релейными выходами своих блоков «С2000-СП1» от своих разделов. Взаимодействие приборов, подключённых к разным пультам, возможно только через АРМ. При отключении компьютера с работающим на нем АРМ эта связь нарушается. Поэтому если требуется, например, организовать релейный выход, который должен отрабатывать состояние всех шлейфов сигнализации системы, и этот выход должен работать при отключении компьютера, лучше его организовать путём монтажного объединения выходов каждой подсистемы (параллельного или последовательного, в зависимости от требуемой тактики работы выхода).

При подключении к АРМ нескольких подсистем следует использовать пульты «С2000М», так как при использовании пультов «С2000» будут следующие ограничения:

  1. Невозможно организовать централизованный контроль доступа;
  2. Управлять взятием/снятием с охраны разделов с клавиатур «С2000-К» и блока «С2000-4», прибора «С2000-КДЛ» и т.п. можно только в рамках одной подсистемы на пульте «С2000». Это означает, что с какой-либо клавиатуры «С2000-К» можно управлять взятием/снятием с охраны разделов того пульта, к которому подключена клавиатура. Управление с этой клавиатуры приборами, подключёнными к другим пультам, невозможно. Из оперативной задачи АРМ можно управлять взятием/снятием с охраны разделов всех подсистем. При использовании пульта «С2000М» первое ограничение снимается. Что касается второго, то можно управлять взятием/снятием с охраны разделов одной подсистемы с помощью всех приборов другой подсистемы, за исключением клавиатур «С2000-К». Например, используя считыватели устройств «С2000-4», «С2000-2», «С2000-КДЛ». Также можно управлять взятием/снятием с охраны разделов одной подсистемы с пульта «С2000М» другой подсистемы. Клавиатуры «С2000-К» так же, как и в первом случае, работают только в рамках своей подсистемы.

Помимо схемы, представленной на предыдущем рисунке, подключить несколько пультов «С2000М» к компьютеру с АРМ можно при помощи ЛВС и преобразователей «С2000-Ethernet».

Основными достоинствами ЛВС являются:

  • повсеместное использование сетей Ethernet;
  • высокая помехозащищенность;

Также при использовании «С2000-Ethernet» возможно объединение приборов ИСО «Орион» через глобальную сеть Internet используя VPN туннель.

Для трансляции по указной схеме необходима устойчивая связь между VPN шлюзами (зависит от характеристик выделенных каналов Internet).

В «С2000-Ethernet» имеется поддержка прямой передачи данных по ЛВС, т.е. на стороне ПК с АРМ используется только сеть Ethernet, а ПО формирует один виртуальный COM-порт для группы удаленных «C2000-Ethernet» (см. рис.). При этом повышается быстродействие и упрощается монтаж системы, т.к. на стороне АРМ нет необходимости использовать COM-порт.

Обращаем Ваше внимание на то, что развёрнутые протоколы испытаний устройств передачи данных по различным каналам связи, о которых дальше будет идти речь, с необходимыми настройками можно найти на сайте сайт в разделе «Техническая поддержка»/ «Рекомендации по применению».

Ещё одним вариантом подключения пульта «С2000М» к компьютеру с АРМ является использование волоконно-оптической линии связи и преобразователей «RS-FX-MM» (для многомодовых ВОЛС), «RS-FX-SM40» (для одномодовых ВОЛС).

Основные достоинства ВОЛС:

  • высокая помехозащищенность;
  • искро-взрывобезопасность;
  • высокая скорость передачи данных.

Компания «Болид» поставляет сертифицированные в соответствии с преобразователи информационных интерфейсов ИСО «Орион» в ВОЛС, которые могут применяться в том числе в системах АПС и пожарной автоматики. Максимальная длина передачи данных для преобразователя «RS-FX-MM» составляет 2 км, для преобразователя «RS-FX-SM40» - 40 км.

Организовать связь сетевого контроллера (компьютера с установленным АРМ «Орион»/ «Орион Про» или пульта «С2000»/«С2000М») с удаленными приборами ИСО «Орион» можно также с помощью стандартного цифрового канала связи в потоке Е1.

Основными достоинствами цифровых каналов связи являются:

  • высокая помехоустойчивость;
  • высокая степень защиты передаваемой информации;
  • высокая скорость передачи данных;
  • слабая зависимость качества передачи от длины линии связи.

Специалистами компании «Болид» была проверена работа системы «Орион» с применением мультиплексоров «ГМ-2» фирмы «Зелакс» для передачи сообщений по цифровому каналу связи в потоке Е1.

В последнее время последовательный способ передачи данных вытесняет параллельный.
За примерами далеко ходить не надо: появление шин USB и SATA говорит само за себя.
И действительно, параллельную шину трудно масштабировать (удлинить шлейф, увеличить частоту тактирования шины), неудивительно, что технологии поворачиваются к параллельным шинам задней частью.

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

На сегодня существует великое множество различных интерфейсов последовательной передачи данных.
Кроме уже упомянутых USB и SATA еще можно вспомнить как минимум два широко известных стандарта RS-232 и MIDI (он же и GamePort).
Объединяет их все то же - последовательная передача каждого бита информации, или Serial Interface.
Преимуществ у подобных интерфейсов великое множество, и самое главное из них - малое количество соединительных проводов, а следовательно, меньшая цена.

Передача данных

Последовательную передачу данных можно реализовать двумя способами: асинхронным и синхронным.

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

Асинхронная передача подразумевает использование специальных битов, маркирующих начало и конец данных – стартового (логический ноль) и стопового (логическая единица) бита.
Также возможно использование специального бита четности, который определяет четное или нечетное количество передаваемых единичных битов (в зависимости от принятого соглашения).
На принимающей стороне проводится анализ этого бита, и если бит четности не соответствует количеству единичных битов, то пакет данных пересылается снова.

Стоит отметить, что такая проверка позволяет обнаружить ошибку только в том случае, если был передан неправильно только один бит, в случае, если неправильно передались несколько битов, эта проверка уже становится некорректной.
Посылка следующего пакета данных может происходить в любой момент после посылки стопового бита, и, естественно, должна начинаться со стартового бита.
Ничего не понятно?

Ну, если бы все компьютерные технологии были просты, то любая домохозяйка давно бы уже лепила параллельно с пельменями новые протоколы …
Попробуем взглянуть на процесс по-другому.
Данные передаются пакетами, примерно как IP пакеты, вместе с данными идут и информационные биты, количество этих битов может варьироваться от 2 до 3 с половиной.
С половиной?!
Да, ты не ослышался, именно с половиной!

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

Такой способ передачи подразумевает, что приемник и передатчик должны работать с одной скоростью (ну, или почти с одной), иначе пришедшие биты данных приемник будет либо не успевать обрабатывать, либо принимать старый бит за новый.
Для того чтобы этого избежать, каждый бит стробируется, то есть посылается синхронно со специальным сигналом - «стробом», формируемым внутри прибора.
Существует ряд определенных скоростей работы асинхронных устройств - 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19 200, 38 400, 57 600 и 115 200 бит в секунду.

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

Теперь пару слов о загадочном термине «пакет данных».
Под пакетом в данном случае понимается набор битов, передаваемых между стартовым и стоповым битами.
Их число может изменяться от пяти до восьми.
Можно задаться вопросом, почему именно пять-восемь бит?
Почему бы не передать сразу, скажем, килобайт данных внутри пакета?

Ответ очевиден: передавая маленькие пакеты данных, мы пусть и проигрываем, отправляя с ними три служебных бита (от 50 до 30 процентов данных), зато если при передаче пакет будет испорчен, мы легко узнаем это (помнишь про бит четности?) и быстро передадим его снова.
А вот в килобайте данных ошибку обнаружить будет уже трудно, и передавать его будет гораздо сложнее.

В качестве примера асинхронного последовательного устройства передачи данных можно привести COM-порт компьютера, любимый модем с дизайном от Труссарди и мышь, подключаемую к этому же порту, которую недалекие секретарши почему-то все время стараются засунуть в PS/2.
Работают все эти устройства по интерфейсу RS-232, вернее по асинхронной его части, поскольку в стандарте описана и синхронная передача данных.