Главная страница
Навигация по странице:

  • COMMCONFIG

  • GetCommProperties

  • Титов О.Работа с коммуникационными портами (COM и LPT) в программах для Win32. Титов О.Работа с коммуникационными портами (COM и LPT) в програм. Работа с коммуникационными портами (com и lpt) в программах для Win32. Автор Титов Олег


    Скачать 276 Kb.
    НазваниеРабота с коммуникационными портами (com и lpt) в программах для Win32. Автор Титов Олег
    АнкорТитов О.Работа с коммуникационными портами (COM и LPT) в программах для Win32.doc
    Дата22.10.2017
    Размер276 Kb.
    Формат файлаdoc
    Имя файлаТитов О.Работа с коммуникационными портами (COM и LPT) в програм.doc
    ТипДокументы
    #9678
    КатегорияЭлектротехника. Связь. Автоматика
    страница7 из 9
    1   2   3   4   5   6   7   8   9

    Структура COMMCONFIG


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

    typedef struct _COMM_CONFIG {{

    DWORD dwSize;

    WORD wVersion;

    WORD wReserved;

    DCB dcb;

    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


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

    lpCC


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

    lpdwSize


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

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

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

    . . .

    COMMCONFIG *cf;

    DWORD sz;

    HANDLE port;

    . . .

    cf=(COMMCONFIG*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(COMMCONFIG));

    cf->dwSize=sizeof(COMMCONFIG);

    GetCommConfig(port,cf,&sz);

    if(sz > sizeof(COMMCONFIG)) {{

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

    cf->dwSize=sz;

    GetCommConfig(port,cf,&sz);

    }

    . . .

    HeapFree(GetProcessHeap(),0,cf);

    CloseHandle(port);

    . . .

    Функция CommConfigDialog


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

    BOOL CommConfigDialog(

    LPTSTR lpszName,

    HWND hWnd,

    LPCOMMCONFIG lpCC

    );

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

    В
    ид окна может отличаться от приведенного. Это зависит от операционной системы и динамической библиотеки, предоставленной производителем порта.

    Познакомимся с параметрами функции CommConfigDialog:

    lpszName


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

    hWnd


    Описатель окна, которое владеет данным диалоговым окном. Должен быть передан корректный описатель окна-владельца или NULL, если у диалогового окна нет владельца.

    lpCC


    Указатель на структуру COMMCONFIG. Эта структура содержит начальные установки, используемые для отображения в диалоговом окне, и установленные пользователем изменения, при завершении диалога.

    Как и большинство других функций Win32 API, функция CommConfigDialog возвращает отличное от нуля значение, в случае успешного завершения, и нуль, если возникла ошибочная ситуация.

    Функция CommConfigDialog не выполняет настройки порта. Она все лишь позволяет пользователю изменить некоторые поля в блоке DCB, содержащемся в структуре COMMCONFIG. Разумеется, Вы можете изменить установленные пользователем некорректные значения или выполнить дополнительные настройки после вызова функции GetCommConfig.
    1   2   3   4   5   6   7   8   9


    написать администратору сайта