Настройка последовательного порта windows

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

Наряду с параллельным портом 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 описывает лишь физический уровень процесса передачи данных и не касается используемых при этом транспортных протоколов, которые могут меняться в зависимости от используемого коммуникационного оборудования и программного обеспечения.

    Читайте также:  Iso образ всех windows

    Стандарт 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, Serial Port, Onboard Serial Port, Serial Port Address, и т.п.

    Заключение

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

    Настройка параметров порта

    Лекция 16. Программирование COM-портов под операционные системы семейства Windows NT/2000/XP с использованием Visual Studio

    Открытие порта

    С последовательными портами в Win32 работают как с файлами. Следовательно, начинать надо с открытия порта как файла, используя функцию CreateFile. В качестве одного из параметров функции передается имя порта (например, COM1), с которым будет выполняться работа. Попытка создать файл с таким именем приводит к перенаправлению информации на соответствующий порт. Прототип функции выглядит следующим образом:

    Описание параметров функции приводится ниже.

    LpFileName

    В виде строки передается имя открываемого порта (например, “COM1”).

    Читайте также:  Linux sync folders between computers

    DwDesiredAccess

    Определяет режим доступа к порту. Приложение может получить доступ на чтение, запись, чтение/запись данныхы из/в порт. Этот параметр может быть GENERIC_READ – чтение, GENERIC_WRITE – запись, GENERIC_READ | GENERIC_WRITE – возможность выполнения операций чтения и записи.

    DwShareMode

    Определяет режим разделения порта между разными процессами. К порту одновременно могут обратиться несколько процессов. Этот параметр должен быть равен 0. Это означает, что после открытия порта его нельзя будет повторно открыть до тех пор, пока он не будет закрыт использующим его приложением.

    LpSecurityAttributes

    При работе с портами этот параметр не используется и должен принимать значение NULL.

    DwCreationDispostion

    Задаёт способ создания файла. Для коммуникационных портов в это поле должен быть занесен флаг OPEN_EXISTING, указывающий на то, что открывать следует существующий порт

    DwFlagsAndAttributes

    Задаёт атрибуты создаваемого файла, а также управляет различными режимами обработки. В случае выполнения синхронных операций чтения-записи этот параметр принимает значение FILE_ATTRIBUTE_NORMAL.

    HTemplateFile

    Задатся дескриптор файла-шаблона, который в данном случае не используется. Этот параметр должен быть равным NULL.

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

    Пример 1.

    Используя среду разработки Visual Studio .NET, создать программу, которая по нажатию кнопки «Открыть порт» открывала коммуникационный порт COM2 для обмена информацией с внешним устройством в режиме синхронного чтения-записи и отображала в текстовом поле результат его открытия.

    Пояснение. Порядок действий.

    1. Запускаем среду разработки Visual Studio .NET. Создаем новый проект с названием COMTest. В нашем примере приложение создается на базе диалогового окна.

    2. Проектируем внешний вид диалогового окна. Помещаем на форму кнопку (IDC_BUTTON1) и два текстовых поля (IDC_STATIC1, IDC_STATIC2), формируем размер окна, задаём заголовки элементов в поле «Caption» на странице свойств (рис.16.1). Следует обратить внимание, что при добавлении на форму элемента управления «Static text» (текстовое поле), ID по умолчанию принимает значение IDC_STATIC. Поэтому ID необходимо отредактировать.

    Рис.16.1. Вид диалогового окна

    3. Привязываем к элементу управления текстовое поле (IDC_STATIC2) переменную m_status. Для этого необходимо выделить элемент управления и из контекстного меню выбрать команду «Add Variable». Появится диалоговое окно, показанное на рис.16.2. В поле «Variable name» задать имя переменной.

    Рис.16.2. Добавление переменной-члена класса

    4. Добавляем переменную – член класса CCOMTestDlg, в которой будет храниться дескриптор порта. Для этого в окне «Class View» выделяем класс «CCOMTestDld» и из контекстного меню, в подменю «Add» выбираем «Add Variable» (рис.16.3).

    Рис.16.3. Добавление переменной

    Имя переменной должно быть m_hCom, а тип переменной – HANLDE.

    5. Добавляем обработчик нажатия на кнопку «Открыть порт». Функция – обработчик события нажатия на кнопку должна иметь следующий вид:

    // открываем последовательный порт

    m_status.SetWindowText(«Невозможно открыть порт!»);

    // если невозожно открыть порт, выводится информация в текстовом поле

    else // если порт открыт

    // сообщаем, что порт открыт

    На рис.16.4. показано диалоговое окно программы после компиляции проекта.

    Рис.16.4. Окно программы

    Нажав на кнопку «Открыть порт» и при успешном выполнении операции, появится соответствующая надпись.

    Недостатком созданного фрагмента программы является отсутствие у пользователя возможности интерактивного выбора открываемого порта. В том случае, если порт СОМ2, привязка к которому жёстко указана в параметре lpFileName функции CreateFile, отсутствует или используется операционной системой компьютера для обслуживания мыши или модема, в текстовом поле появится сообщение «Невозможно открыть порт», а обратиться к свободному порту – например, СОМ1 – из этой же программы не представляется возможным.

    Читайте также:  Good work app windows

    Для демонстрации более гибкого способа инициализации последовательных портов рассмотрим следующий пример.

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

    Пояснение. Порядок действий:

    1. Запускаем среду разработки Visual Studio .NET и открываем предыдущий проект (COMTest).

    2. Добавляем на форму элемент управления «Combo Box» — список, из которого пользователь сможет выбрать нужный порт. Вид диалогового окна программы представлен на рис.16.5.

    Рис.16.5. Модифицированный вид диалогового окна

    В поле «Type» в окне свойств списка выбрать тип «DropList».

    3. Привязываем к элементу управления «Combo Box» переменную m_port. На рис.16.6 представлено диалоговое окно добавления переменной с требуемыми параметрами.

    Рис.16.6. Добавление переменной

    4. Поиск последовательных портов, установленных в системе, будет осуществляться с помощью анализа ключей системного реестра ОС Windows. Для работы с реестром используется класс CRegKey. В начале файла COMTestDlg,cpp необходимо добавить строку:

    Следующий код необходимо добавить в конец функции OnInitDialog() класса CCOMTestDlg, которая вызывается перед появлением окна программы на экране.

    CRegKey reg; // класс для работы с реестром

    HKEY key; // дескриптор ключа реестра

    «HARDWARE\\DEVICEMAP\\SERIALCOMM»); // открытие ключа реестра

    if(result!=ERROR_SUCCESS) MessageBox(«Нет доступа к реестру!»);

    char s[255]; // буфер

    DWORD size; // переменная для передачи в функцию

    for(int i=0;i DCBlength=sizeof(DCB); // размер структуры

    pDCB->BaudRate=CBR_9600; // скорость работы порта

    pDCB->ByteSize=8; // размер передаваемых слов

    pDCB->StopBits=ONESTOPBIT; // количество стоповых бит — 1

    pDCB->Parity=NOPARITY; // четность отсутствует

    ct.ReadIntervalTimeout=10; // значение тайм-аут чтения

    ct.ReadTotalTimeoutConstant=100; // значение тайм-аут записи

    ct.ReadTotalTimeoutMultiplier=2; // множитель тайм-аута чтения

    ct.WriteTotalTimeoutConstant=100; // множитель тайм-аута записи

    ct.WriteTotalTimeoutMultiplier=2; // общий множитель

    if(! SetCommState(m_hCom,pDCB))// установка новых параметров порта

    MessageBox(«Невозможно установить параметры порта!»);

    if(!SetCommTimeouts(m_hCom,&ct)) // установка тайм-аутов

    MessageBox(«Невозможно установить значения тайм-аутов!»);

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

    Для понимания тайм-аутов предположим следующее. Пусть мы считываем 50 символов из порта со скоростью 9600. При этом используется 8 бит на символ, дополнение до четности и один стоповый бит. Таким образом, на один символ в физической линии приходится 11 бит, включая стартовый. 50 символов на скорости 9600 будут приниматься 50∙11/9600 = 0.0572916 секунд, или примерно 57.3 миллисекунды, при условии нулевого интервала между приемом последовательных символов. Если интервал между символами составляет примерно половину времени передачи одного символа, т.е. 0.5 миллисекунд, то время приема будет 50∙11/9600+49∙0.0005=0.0817916 секунд, или примерно 82 миллисекунды. Если в процессе чтения прошло более 82 миллисекунд, то мы вправе предположить, что произошла ошибка в работе внешнего устройства и прекратить считывание, избежав тем самым зависания программы. Это и есть общий тайм-аут операции чтения. Аналогично существует и общий там-аут операции записи. Формула для вычисления общего тайм-аута операции, например чтения, выглядит так:

    NumOfCharReadTotalTimeoutMultiplier + ReadTotalTimeoutConstant,

    где NumOfChar — это число символов запрошенных для операции чтения.

    Теперь небольшой пример. ReadTotalTimeoutMultiplier = 2, ReadTotalTimeoutConstant = 1, ReadIntervalTimeout = 1, считывается 250 символов. Если операция чтения завершится за 250 * 2 + 1 = 501 миллисекунду, то будет считано все сообщение. Если операция чтения не завершится за 501 миллисекунду, то она все равно будет завершена. При этом будут возвращены символы, прием которых завершился до истечения тайм-аута операции. Остальные символы могут быть получены следующей операцией чтения. Если между началами двух последовательных символов пройдет более 1 миллисекунды, то операция чтения так же будет завершена.

    Оцените статью