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

на главную

Жанры

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

GetCommProperties(port,pr);

}

HeapFree(GetProcessHeap,0,pr);

CloseHandle(port);

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

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

Структура COMMCONFIG

Начнем с самой структуры COMMCONFIG:

typedef struct _COMM_CONFIG {{

DWORD dwSize;

WORD wVersion;

WORD wReserved;

DCB dсb;

DWORD dwProviderSubType;

DWORD dwProviderOffset;

DWORD dwProviderSize;

WCHAR wcProviderData[1];

} COMMCONFIG, *LPCOMMCONFIG;

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

• dwSize

Задает размер структуры COMMCONFIG в байтах

• wVersion

Задает номер версии структуры COMMCONFIG. Должен быть равным 1.

• wReserved

Зарезервировано и не используется

• dcb

Блок управления устройством (DCB) для порта RS-232.

• dwProviderSubType

Задает тип устройства и формат устройство-зависимого блока информации. Фактически это тип порта. Конкретные значения данного поля приведены в описании структуры COMMPROP выше.

• dwProviderOffset

Смещение, в байтах, до устройство-зависимого блока информации от начала структуры.

• dwProviderSize

Размер, в байтах, устройство-зависимого блока информации.

• wcProviderData

Устройство-зависимый блок информации. Это поле может быть любого размера или вообще отсутствовать. Поскольку структура COMMCONFIG может быть в дальнейшем расширена, для определения положения данного поля следует использовать dwProviderOffset. Если dwProviderSubType PST_RS232 или PST_PARALLELPORT,

то данное поле отсутствует. Если dwProviderSubType PST_MODEM, то данное поле содержит структуру MODEMSETTINGS.

Функция GetCommConfig

Несмотря на то, что нам нужен только DCB, приходится иметь дело со всеми полями. Заполнение данной структуры противоречивыми данными может привести к неправильной настройке порта, поэтому следует пользоваться функцией GetCommConfig:

BOOL GetCommConfig(

HANDLE hCommDev,

LPCOMMCONFIG lpCC,

LPDWORD lpdwSize

);

Параметры функции следующие:

• hCommDev

Описатель открытого коммуникационного порта.

• IpCC

Адрес выделенного и заполненного нулями, кроме поля dwSize, блока памяти под структуру COMMCONFIG. В поле dwSize нужно занести размер структуры COMMCONFIG. После вызова функции все поля структуры будут содержать информацию о текущих параметрах порта.

• IpdwSize

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

В случае успешного завершения функция возвращает ненулевое значение.

Как всегда не обошлось без тонкостей. Структура COMMPROP имеет переменную длину, поэтому затруднительно сразу выделить требуемый блок памяти. Как и в случае с функцией GetCommProperties, функцию GetCommConfig придется вызывать дважды:

COMMCONFIG *cf;

DWORD sz;

HANDLE port;

сf=(COMMCONFIG*)HeapAlloc(GetProcessHeap,HEAP_ZERO_MEMORY,sizeof(COMMCONFIG));

cf->dwSize=sizeof(COMMCONFIG);

GetCommConfig(port,cf,&sz);

if(sz > sizeof(COMMCONFIG)) {{

сf=(COMMCONFIG*)HeapRealloc(GetProcessHeap,HEAP_ZERO_MEMORY,cf,sz);

cf->dwSize=sz;

GetCommConfig(port,cf,&sz);

};

...

HeapFree(GetProcessHeap,0,cf);

CloseHandle(port);

Функция CommConfiaDialoa

Теперь, имея заполненую корректной информацией структуру COMMCONFIG, можно позволить пользователю выполнить настройку параметров с помощью функции CommConfigDialog:

BOOL CommConfigDialog(

LPTSTR IpszName,

HWND hWnd,

LPCOMMCONFIG IpCC

);

Вызов этой функции приводит к отображению примерно такого диалогового окна:

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

Хроники хвостатых: Ну мы же биджу...

Rana13
Фантастика:
фэнтези
5.00
рейтинг книги
Хроники хвостатых: Ну мы же биджу...

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Ржевско-Вяземские бои. Часть 2

Антонова Людмила Викторовна
6. Летопись Победы. 1443 дня и ночи до нашей Великой Победы во Второй мировой войне
Научно-образовательная:
военная история
6.25
рейтинг книги
Ржевско-Вяземские бои. Часть 2

Смерть любит танцы

Klara Клара
1. Танцы
Фантастика:
фэнтези
8.96
рейтинг книги
Смерть любит танцы

По воле короля

Леви Кира
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
По воле короля

Барон Дубов 4

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

Измена. Жизнь заново

Верди Алиса
1. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Жизнь заново

Зубных дел мастер

Дроздов Анатолий Федорович
1. Зубных дел мастер
Фантастика:
научная фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Зубных дел мастер

Кротовский, сколько можно?

Парсиев Дмитрий
5. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кротовский, сколько можно?

Третий. Том 2

INDIGO
2. Отпуск
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Третий. Том 2

Барон Дубов

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

Тайны затерянных звезд. Том 2

Лекс Эл
2. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
фэнтези
5.00
рейтинг книги
Тайны затерянных звезд. Том 2

Возвышение Меркурия. Книга 16

Кронос Александр
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 16

Релокант

Ascold Flow
1. Релокант в другой мир
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Релокант