Первая программа
Теперь, когда мы рассмотрели первые две функции, предназначенные для управления портами асинхронного последовательного адаптера, приведем исходный текст приложения 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 |
Рис 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