Модемы и факс-модемы. Программирование для MS-DOS и Windows

       

Первая программа


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

Приложение OPENCOMM последовательно открывает и закрывает все порты асинхронного адаптера, начиная с COM1 до COM8. При этом оно определяет номера доступных портов и выводит на экран их список. Главный файл приложения OPENCOMM представлен в листинге 7.1.

Листинг 7.1. Файл OPENCOMM.CPP

// ============================================================

// Определение доступных COM-портов

// ============================================================

#define      STRICT

#include    <windows.h>

// Прототип функции

BYTE FAR FindCOMPorts( void );

// ============================================================

// Функция WinMain

// ============================================================



#pragma argsused

int PASCAL

WinMain( HINSTANCE hInstance,

                  

HINSTANCE hPrevInstance,

                  

LPSTR lpCmdLine,

                  

int nCmdShow )

{

     

char  szMsg[ 60 ] = "";

     

BYTE  bFindPort;

     

// Определяем доступные для использования COM-порты

     

bFindPort = FindCOMPorts();

     

// Формируем строку результата с названиями доступных портов

     

for(int nBitNum = 0; nBitNum < 8; nBitNum++)

     

{

            

if (bFindPort & (BYTE) (1 << (BYTE)nBitNum))

            

wsprintf( szMsg, "%sCOM%d ", (LPSTR) szMsg, nBitNum + 1 ) ;

     

}

     

// Отображаем на экране сообщение с названиями доступных

     

// COM-портов

     

MessageBox(NULL, szMsg, "Обнаружены COM-порты:",

                          

MB_OK | MB_ICONINFORMATION);

     

return 0;

}

// ============================================================

// Функция FindCOMPorts вызывает функцию OpenComm

// и определяет, какие COM-порты установлены в компьютере и

// доступны для использования

// ============================================================


BYTE FAR FindCOMPorts( void )

{

      // Буфер для подготовки имени порта

      char     szCommPattern[8];    

      // Идентификатор COM-порта

      int  idComDev;

      // Переменная для формирования результата

      BYTE  bFindPort = 0;

      // Вспомогательная переменная nBitNum

      int  nBitNum = 1;

      // Пробуем открыть COM-порты COM1 - COM8

      for(int i = 0; i < 8; i++) {

                          wsprintf( szCommPattern, "COM%d", i + 1 ) ;

             // Открываем COM-порт

             idComDev = OpenComm(szCommPattern, 1024, 1024);

             if (idComDev >= 0)

             {

                   // Если COM-порт n успешно открыт, тогда устанавливаем

                   // в переменной bFindPort n-ый бит

                   bFindPort = bFindPort | nBitNum;

                   // Закрываем COM-порт

                   CloseComm(idComDev);

             }

             nBitNum <<= 1;

      }

      // Возвращаем результат

      return bFindPort;

}

После запуска приложения OPENCOMM, функция WinMain вызывает функцию FindCOMPorts, определяющую список доступных COM-портов.

Функция FindCOMPorts содержит цикл, в котором открывается очередной COM-порт:

idComDev = OpenComm(szCommPattern, 1024, 1024);

Если OpenComm возвращает значение большее или равное нулю, значит COM-порт успешно открыт. В этом случае мы устанавливаем в байте bFindPort бит с номером, соответствующим номеру открытого порта. После этого мы закрываем только что открытый порт:

CloseComm(idComDev);

Затем мы переходим к проверке следующего порта. Если функция OpenComm возвращает значение, меньшее нуля, мы считаем, что порт недоступен.

Проверив в цикле COM-порты от COM1 до COM8, функция FindCOMPorts возвращает байт bFindPort. Каждый бит этого байта отвечает за свой COM-порт.

Установлен бит

Порт доступен

0

COM1

1

COM2

2

COM3

3

COM4

4

COM5

5

COM6

6

COM7

7

COM8

Получив байт bFindPort, WinMain формирует в строке szMsg список доступных портов и выводит его на экран с помощью функции MessageBox (см. рис. 7.1).



Рис 7.1. Список доступных COM-портов

Файл определения модуля приложения OPENCOMM приведен в листинге 7.2.

Листинг 7.2. Файл OPENCOMM.DEF

; =============================================================

; Файл определения модуля

; =============================================================

NAME OPENCOMM

DESCRIPTION 'Приложение OPENCOMM, (C) 1994, Frolov G.V.'

EXETYPE windows

STUB 'winstub.exe'

STACKSIZE  5120

HEAPSIZE  1024

CODE preload moveable discardable

DATA preload moveable multiple


Содержание раздела