Чтение онлайн

на главную - закладки

Жанры

Интернет-журнал "Домашняя лаборатория", 2007 №8
Шрифт:

Мне часто задают вопросы о работе с СОМ портами из программ, написанных для Windows 95/98/NT. Причем чаще всего спрашивают разработчики всевозможных управляющих устройств. Эти устройства либо были разработаны давно, еще в эпоху MS-DOS, либо разрабатываются сейчас. Но объединяет их одно — устройство должно подключаться к компьютеру, в большинстве случаев через RS-232 (СОМ), реже, через Centronics (LPT).

В литературе, чаще всего, управление последовательным и параллельным портами описывается на уровне регистров этих портов, причем примеры программ приводятся на языке Assembler. Это не удивительно. Последовательный порт довольно

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

Написать программу, управляющую устройством через СОМ порт, для MS-DOS не так сложно. Это частенько делали не программисты, а сами разработчики устройства. Сложнее было сделать красивый и удобный интерфейс пользователя. Этим обычно занимались профессиональные программисты. С платформой Win32 дело обстоит сложнее. Но только на первый взгляд. Конечно, напрямую работать с регистрами портов нельзя, Windows это не позволяет, зато можно не обращать внимания на тонкости различных реализаций (i8055, 16450, 16550А) и не возиться с обработкой прерываний.

Описание программирования будет состоять из подробного описания функций, специфических для работы с портами, краткого описания функций работы с файлами (с портами в Win32 работают как с файлами), краткого описания функций многопотоковой обработки и, естественно, примеров программ.

Функция CreateFile

Как я уже говорил, с последовательными и параллельными портами в Win32 работают как с файлами. Следовательно, начинать надо с открытия порта как файла. Использовать привычные функции open и fopen при этом нельзя, необходимо воспользоваться функцией CreateFile. Эта функция предоставляется Win32 API. Ее прототип выглядит так:

HANDLE CreateFile (

LPCTSTR lpFileName,

DWORD dwDesiredAccess,

DWORD dwShareMode,

LPSECURITY_ATTRIBUTES IpSecurityAttributes,

DWORD dwCreationDistribution,

DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile

);

Функция имеет много параметров, большинство из которых нам не нужны. Приведу краткое описание параметров:

• IpFileName

Указатель на строку с именем открываемого или создаваемого файла. Формат этой строки может быть очень хитрым. В частности можно указывать сетевые имена для доступа к файлам на других компьютерах. Можно открывать логические разделы или физические диски и работать в обход файловой системы. Однако для наших задач это не нужно. Последовательные порты имеют имена "СОМ1", "COM2", "COM3", "COM4" и так далее. Точно так же они назывались в MS-DOS, так что ничего нового тут нет. Параллельные порты называются "LPT1", "LPT2" и так далее. Учтите, что если у Вас к порту СОМ1 подключена мышь, Windows не даст открыть этот порт. Аналогично не удастся открыть LPT1 если подключен принтер. А вот с модемом дела обстоят немного по другому. Если какая-либо программа использует модем, например вы дозвонились до своего провайдера Internet, то Вашей программе не удастся открыть порт к которому подключен модем. Во всех остальных случаях порт будет открыт и Вы сможете работать с модемом сами, из своей программы.

• dwDesiredAccess

Задает тип доступа к файлу. Возможно использование следующих значений:

• 0 — Опрос атрибутов устройства без получения доступа к нему.

• GENERICREAD — Файл будет считываться.

• GENERICWRITE — Файл будет записываться.

• GENERIC_READ|GENERIC_WRITE — Файл будет и считываться и записываться.

• dwShareMode

Задает

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

• IpSecurityAttributes

Задает атрибуты защиты файла. Поддерживается только в Windows NT. Однако при работе с портами должен в любом случае равняться NULL.

• dwCreationDistribution

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

• dwFlagsAndAttributes

Задает атрибуты создаваемого файла. Так же управляет различными режимами обработки. Для наших целей этот параметр должен быть или равным 0, или FILE_FLAG_OVERLAPPED. Нулевое значение используется при синхронной работе с портом, a FILE_FLAG_OVERLAPPED при асинхронной, или другими словами, при фоновой обработке ввода/вывода. Подробнее про асинхронный ввод/вывод я расскажу позже.

• hTemplateFile

Задает описатель файла-шаблона. При работе с портами всегда должен быть равен NULL.

При успешном открытии файла, в нашем случае порта, функция возвращает описатель (HANDLE) файла. При ошибке INVALID HANDLE VALUE. Код ошибки можно получить, вызвав функцию GetLastError, но ее описание выходит за рамки данной статьи.

Функция CloseHandle

Открытый порт должен быть закрыт перед завершением работы программы. В Win32 закрытие объекта по его описателю выполняет функция CloseHandle:

BOOL CloseHandle(

HANDLE hObject

);

Функция имеет единственный параметр — описатель закрываемого объекта. При успешном завершении функция возвращает не нулевое значение, при ошибке нуль.

Теперь пример (достаточно очевидный):

#include <windows.h>

HANDLE port;

port=CreateFile"COM2",GENERIC_READ|GENERIC_WRIТЕ,0,NULL,OPEN_EXISTING,0,NULL);

}:

if(port==INVALID_HANDLE_VALUE) {{

MsgBox(NULL,"Невозможно открыть последовательный порт","Error",MB OK);

ExitProcess(1);

}

CloseHandle(port);

В данном примере открывается порт COM2 для чтения и записи, используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.

Открыв порт, мы получили его в свое распоряжение. Теперь с портом может работать только наша программа. Однако, прежде чем мы займемся вводом/выводом, мы должны настроить порт. Это касается только последовательных портов, для которых мы должны задать скорость обмена, параметры четности, формат данных и прочее. Кроме того, существует несколько специфичных для Windows параметров. Речь идет о тайм-аутах, которые позволяют контролировать как интервал между принимаемыми байтами, так и общее время приема сообщения. Есть возможность управлять состоянием сигналов управления модемом. Но обо всем по порядку.

Основные параметры последовательного порта описываются структурой DCB. Временные параметры структурой COMMTIMEOUTS. Существует еще несколько информационных и управляющих структур, но они используются реже. Настройка порта заключается в заполнении управляющих структур и последующем вызове функций настройки.

Структура DCB

Поскольку основную информацию содержит структура DCB, с ее описания и начнем:

Поделиться:
Популярные книги

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Барон Дубов

Карелин Сергей Витальевич
1. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов

Невеста драконьего принца

Шторм Елена
Любовные романы:
любовно-фантастические романы
5.25
рейтинг книги
Невеста драконьего принца

Интернет-журнал "Домашняя лаборатория", 2007 №6

Журнал «Домашняя лаборатория»
Дом и Семья:
хобби и ремесла
сделай сам
5.00
рейтинг книги
Интернет-журнал Домашняя лаборатория, 2007 №6

Око василиска

Кас Маркус
2. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Око василиска

Законы Рода. Том 6

Андрей Мельник
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Маленькая хозяйка большого герцогства

Вера Виктория
2. Герцогиня
Любовные романы:
любовно-фантастические романы
7.80
рейтинг книги
Маленькая хозяйка большого герцогства

Лучший из худших-2

Дашко Дмитрий Николаевич
2. Лучший из худших
Фантастика:
фэнтези
5.00
рейтинг книги
Лучший из худших-2

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Полное собрание сочинений. Том 25

Толстой Лев Николаевич
Проза:
классическая проза
5.00
рейтинг книги
Полное собрание сочинений. Том 25

Перед бегущей

Мак Иван
8. Легенды Вселенной
Фантастика:
научная фантастика
5.00
рейтинг книги
Перед бегущей