Как подключить com порт

Всех приветствую вновь на страницах своего блога и сегодня хочу рассказать, как подключить com порт usb в Windows . Поговорим, что это такое и для чего используется. Я думаю для начинающих сетевых администраторов, да и просто для продвинутых пользователей это будет интересно, для меня в свое время это было просто какой-то магией, позволяющая настраивать серверное оборудование.
Что подключают через com порт
Через com порт ранее подключали модемы, мышки. Сейчас он используется для соединения с источниками бесперебойного питания, для связи с аппаратными средствами разработки встраиваемых вычислительных систем, спутниковыми ресиверами, кассовыми аппаратами, с приборами систем безопасности объектов, а также с многими прочими устройствами.
С помощью COM-порта можно соединить два компьютера, используя так называемый «нуль-модемный кабель» (см. ниже). Использовался со времен MS-DOS для перекачки файлов с одного компьютера на другой, в UNIX для терминального доступа к другой машине, а в Windows (даже современной) — для отладчика уровня ядра.
Но в сетевом мире через com порт подключаются к консольному порту сетевых устройств (коммутаторов, роутеров, таких брендов как Cisco или Juniper)
Какая схема подключения к коммутаторам через последовательный порт. Есть переходники, например от фирмы st-lab На одном конце USB который вы подключаете к компьютеру, а второй это com порт.

Далее к ком порту подсоединяется вот такой шнурок, com порт, а с другой стороны LAN RJ45, и вся схема дает нам один большой шнурок USB to LAN.

Установка драйверов com порт usb в Windows
К сожалению в Windows подключенные устройства, usb to com не всегда автоматически устанавливаются в системе, и приходится искать для них драйвера. Если вы покупали его сами, то в комплекте шел диск с драйверами, и можно воспользоваться им, если его нет, то смотрим как найти драйвера.
Открываем диспетчер устройств в Windows. Если не знаете как, то нажмите CTR+Pause breake, либо нажмите Win+R и в окне выполнить введите devmgmt.msc. Как видите у меня в разделе Порты (COM и LPT) нашелся на третьем COM порту неизвестный провод, и драйверов для него не нашлось у системы, о чем говорит нам желтый значок.

Переходим в свойства данного устройства и выбираем ИД оборудования, у вас будет, что то по типу usb\VID_067B&PID_2303&REV_0300, вот его вы копируете и ищите в гугле или яндексе.

После чего щелкаем правым кликом по устройству в диспетчере устройств и выбираете установить драйвера, указываете до них путь и ставите, если все ок, то у вас пропадет значок предупреждения.
Далее вы уже можете использовать возможности com порта, с помощью таких утилит на подобие Putty, где вы выбираете пункт Serial и указываете нужный порт Com порта, посмотреть его можно в том же диспетчере устройств.

Надеюсь вы научились и разобрались как подключать com порт usb в Windows.
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. Она проста в понимании и одновременно может преобразовывать два логических сигнала.
Ниже приведена схема её включения:

Думаю, трудностей быть не должно. Это один из вариантов использования этой микросхемы: передача данных с микроконтроллера на ЭВМ и наоборот. Передаваемый сигнал поступает на ножки TxIN с одной стороны и на RxIN с другой. Входные сигналы снимаются с TxOUT и RxOUT соответственно.
Программирование
Для начала поговорим о программировании портов на низком уровне. Так будет более правильно. Я очень много нервов потратил, разбираясь с этим интерфейсом, пока не начал вникать в принцип его работы на более низком уровне, нежели простая передача символов. Если будет понятно это, значит и с языками высокого уровня проблем не будет.
Ниже представлены адреса 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). Ниже приведена зависимость скорости передачи данных от коэффициента делителя:
| Делитель | Скорость передачи (в бодах) |
Делитель | Скорость передачи (в бодах) |
|---|---|---|---|
| 1040 | 110 | 24 | 4800 |
| 768 | 150 | 12 | 9600 |
| 384 | 300 | 6 | 19200 |
| 192 | 600 | 3 | 38400 |
| 96 | 1200 | 2 | 57600 |
| 48 | 2400 | 1 | 115200 |
Interrupt Enable Register (IER)
Если DLAB=0, то он используется как регистр управления прерываниями от асинхронного адаптера, если DLAB=1, то в нём задаётся старший байт делителя частоты тактового генератора.
| Бит | Значение |
|---|---|
| 0 | 1 – разрешемие прерывания при готовности принимаемых данных. |
| 1 | 1 – разрешение прерывания после передачи байта (когда выходной выходной буфер передачи пуст). |
| 2 | 1 – разрешение прерывания по обнаружении состояния "BREAK" или ошибки. |
| 3 | 1 – разрешение прерывания по изменению на разъёме RS-232C. |
| 4-7 | Не используются, должны быть равны 0. |
Interrupt Identification Register (IIR)
Прерывание – это событие, при котором останавливается выполнение основной программы и начинается выполнение процедуры прерываний. Этот регистр определяет тип произошедшего прерывания.
| Бит | Значение |
| 0 | 1 – нет прерываний, ожидающих обслуживания. |
| 1-2 | 00 – переполнение приёмника, ошибка чётности или формата данных, или при состоянии "BREAK". Сбрасывается после чтения состояния линии и порта 3FDh. |
| 01 – данные приняты и доступны для чтения. Сбрасывается после после чтения регистра LSR. | |
| 11 – Состояние модема. Устонавливается при изменении состояния входных линий CTS, RI, DCD, DSR. | |
| 3-7 | Равны 0. |
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)
Регистр состояния модема.
| Бит | Значение |
|---|---|
| 0 | Изменилось состояние линии CTS |
| 1 | Изменилось состояние линии DSR |
| 2 | Изменилось состояние линии IR |
| 3 | Изменилось состояние линии DCD |
| 4 | Состояние линии CTS |
| 5 | Состояние линии DSR |
| 6 | Состояние линии IR |
| 7 | Состояние линии DCD |
Ну вот и всё. Оперируя этими регистрами, можно напрямую общаться с COM-портом, управлять передачей и приёмом данных. Если вам не хочется возиться с памятью, можно воспользоваться уже готовыми компонентами для различных сред программирования: C++, VB, Delphi, Pascal и т.д. Они интуитивно понятны, поэтому, думаю, здесь не стоит заострять на них внимание.
RS232. Взгляд изнутри

Последовательный порт (далее ПП) удобный инструмент для общения между разными периферийными устройствами (как собранные самостоятельно на основе какого-нибудь МК, так и заводские: принтеры, осциллографы и т.д.) с одной стороны, и ПК с другой. На сегодняшний день наиболее популярные из всех ПП являются RS232 стандарт (переводится как «Recommended Standard») за его простоту и USB стандарт («Universal Serial BUS») за его резвость.
USB бесспорно вещь полезная, но жудко навороченная. Поскольку многим самодельным устройствам бешенный обмен данными с ПК неособо нужон, тогда на помощи приходит простой, надежный и многоопытный RS232 Интерфейс.
По RS232 стандарту устройства участвующие в обмене данными бывают двух типов:
Data Terminal Equipment (DTE) (устройство отдающее команды — ведущий) и
Data Circuit-Terminating Equipment (DCE) (периферия, обслуживающая хозяина — ведомый). Нередко, некоторые периферийные устройства ведут себя как DTE (например осциллографы, или наши с вами девайсы).
Типы соединения
Модемное соединение — подрозумеваеи наличие некой иерархии, тоесть в случае когда в обмене данными участвуют больше чем два устройства им необходим некий арбитр (модем), разрешающий в определенный момент времени отсылать данные только одному устройству (в то время как читать могут хоть все остальные). Модемом может быть что угодно: отдельный девайс, или один из участников обмена данными, главное недопустить потери данных.

В случае когда устройств только два, или есть явный ведущий которого слушаются все остальные, никакого посредника им не нужно, а это означает что к их общению больше никто не подключится, и никакого арбитра в лице модема им не надо ( в отличие от предыдущего типа соединения, когда к одному принтеру можно подключить штук 10 ПК ). Опять-же главное недопустить одновременной отправки данных — в определенный момент времени, общатся может только одна пара устройств. Такое соединение называется нуль-модемное соединение:

Типы передач данных
Минимальное количество проводков необходимое для обмена данными равно двум (этокий жадный изврат), если передача является односторонней ([Tx, GND]). В случае когда необходимо полноценное — двухстороннее общение число проводков возростает аж до трех ([Rx, Tx, GND]). Большинство периферийных устройств поддерживают одновременную передачу и прием данных — full-duplex, но если один из собеседников на такое не способен, обмен переходит в разряд неполноценных — half-duplex (пока один не закончил передачу/прием другой пляшит под его дудку).
Распиновка COM разъёма


В столбце Signal Name, DATA Terminal можно заменить на ПК (то есть Data Terminal Ready соответствует ПК готов к работе), а DATA Set на Периферия.
Как следует из предыдущей таблицы, все пины делятся на управляющие (control pins) и транспортные (Data pins). Каждый пин в определенный момент времени может находьтся только в одном из двух состояний: активном (on) или неактивном (off). Чтобы не запутатся, и както защитить данные от помех, разработчики решили что во время передачи данных они были сначало усилены (+5В –> +12В, 0В –> -12В ) а потом инвертированы, в то время как c управляющими сигналами они долго не парились и просто их усилели (тоесть положительное стало еще положительней а отрицательное — отрицательнее, относительно общего провода).

Назначение управляющих пинов ([RTS, CTS], [DTR, DSR] и [CD, RI]) сводится к следующему:
• Отслеживать состояние собеседника
• Отслеживать поток данных
Пара [RTS, CTS] — используется для обозначения готовности данной пары устройств к передачи/приему соответственно.
1. DTE устройство устанавливает RTS = on, сигнализируя о том что оно готово к приему данных. Если устройство получило достаточное количество данных то устанавливаем RTS =off.
2. DCE устройство устанавливает CTS =on, сигнализируя о том что оно готово к приему данных. Если устройство получило достаточное количество данных то устанавливаем CTS =off.
Кто каким пином будет управлять (тоесть кому быть DTE а кому DCE) решать вам. Соответственно программы управления этими устройствами должны выставить RTS(выход)/CTS (вход), или наоборот, иначе могут быть глюки.
Пара [DTR, DSR] — большинство устройств используют эти пины для сигнализирования что они подключены и готовы к работе.
1. DTE устройство устанавливает DTR=on, сообщая DCE устройству что оно готово к работе. Соответственно когда DTE устанавливает DTR=off, то оно больше не желает (или не может) общатся (положила трубку 🙂 )
2. DCE устройство устанавливает DSR=on, сообщая что оно подключено, а когда DSR=off – оно отключено.
Такой метод контроля потока данных называется – hardware handshaking (чтото вроде аппаратное управление). Пары [DTR, DSR] и [RTS, CTS] могут быть с легкостью взаимо-заменены без всякого ущерба.
Пара [CD, RI] – используется для обозначения (в тот самом случае когда один принтер на отару кампов) что в данный момент линии передачи данных кем-то заняты.
Как правило этой парой управляет модем, но не обязательно.

• St – Стартовый Бит (начало передачи данных) – логический ноль
• 0..8 – позиция бита (данных) в пакете (позиция «0» – LSB)
• P – бит парности (проверка успешной передачи данных)
• Sp1,Sp2 – стоп биты (завершают передачу пакета) – логическая единица
• [] – в скобках обозначены биты которые могут отсутствовать
(биты данных с 5 по 8 так или иначе будут переданы, но не рассмотрены — мусор)
• IDLE – ожидание (логическая единица)
Как я уже говорил, во время передачи — данные инвертируются, так что если будете проверять осциллографом как отсылается пакет — не пугайтесь.
Часто формат пакета обозначается следующим образом: 8-N-1 (8 бит данных, без бита проверки, один стоп бит) или 5-E-2 (5 бит данных (3 бита мусора), с проверкой на четность, два стоп бита).

Поскольку MAX232 поддерживает аппаратное управление COM портом, и если с разводкой данной схемы проблем нет, почемуб и не использовать эту возможность, вдруг когда пригодится (не пропадать же добру). В противном случае, можно обойтись без аппаратного управления, как зачастую и происходит.
Софт
UPD: заменил вывод cout на printf, и убрал флаги RxClear и TxClear
ПП по сути является фаилом из которого ведется чтение/запись, поэтому основные операции которые применяются над ПП можно группировать следующим способом:
Также много интересного можно узнать на следующих сайтах: Programming Serial Connections , Serial programming in win32 OS
Запихните предыдущий код в хидэр фаил, например с именем COM_INIT.h и можно использовать ПП.
Надеюсь эти скромные знания кому-то помогут. Если есть вопросы попытаюсь ответить.