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

       

Функция OpenComm


Перед тем как приложение сможет начать работу с портом асинхронного последовательного адаптера, оно должно открыть этот порт при помощи функции OpenComm.

int OpenComm(LPCSTR lpszDevControl,

                  

UINT cbInQueue, UINT cbOutQueue);

Первый параметр функции lpszDevControl определяет открываемый порт и является указателем на строку, закрытую двоичным нулем, содержащую имя порта. Строка должна иметь формат "COMn" для асинхронного последовательного адаптера или "LPTn" для параллельного адаптера. Вместо символа n следует указать номер открываемого порта.

Как вы уже знаете из предыдущих разделов, COM-порт работает под управлением специального драйвера асинхронного последовательного адаптера. Драйвер принимает данные из порта и записывает их во входную очередь. Затем приложение, по мере надобности может прочитать данные из входной очереди. Когда приложение передает данные в COM-порт, они сначала попадают в выходную очередь драйвера, после чего драйвер передает их непосредственно асинхронному адаптеру.

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

Параметр cbInQueue задает размер входной очереди COM-порта в байтах, а параметр cbOutQueue - размер выходной очереди в байтах.

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

Если по какой-либо причине COM-порт не открыт, функция OpenComm возвращает отрицательное значение - код ошибки. В следующей таблице перечислены возможные значения, возвращаемые функцией в случае возникновения ошибки:

Значение



Смысл

IE_BADID

Неверный или неподдерживаемый идентификатор COM-порта

IE_BAUDRATE

Установлена скорость передачи информации не поддерживается

IE_BYTESIZE

Ошибка при определении размера передаваемых и принимаемых данных

IE_DEFAULT

Не поддерживаются характеристики порта, принятые по умолчанию

IE_HARDWARE

Порт недоступен. Возможно, порт уже используется другим приложением

IE_MEMORY

Не хватает оперативной памяти для размещения входной и выходной очередей COM-порта

IE_NOPEN

Порт не открыт

IE_OPEN

Порт уже открыт

<
Функцию OpenComm можно использовать для того, чтобы узнать открыт ли данный COM-порт. Если перед вызовом функции OpenComm присвоить параметрам cbInQueue и cbOutQueue нулевые значения, то функция возвращает константу IE_OPEN, в случае, когда порт уже открыт или IE_MEMORY в противном случае.

В операционных системах Windows 3.1 и Windows for Worksgroups 3.11 можно использовать COM-порты с номерами от 1 до 9 (COM1-COM9) и параллельные порты от 1 до 3 (LPT1-LPT3). Если вы укажете номер порта, не поддерживаемый драйвером, функция OpenComm вернет код ошибки.

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

Ниже мы приводим исходный текст функции OpenComPort, который вы можете использовать для открывания COM-порта. Чтобы открыть порт, достаточно передать этой функции номер порта.

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

// Функция OpenCommPort

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

int OpenCommPort(int nNumPort)

{

      // Временный буфер для создания имени порта

      char szTmpNamePort[10];

      wsprintf(szTmpNamePort, "COM%d", nNumPort);

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

      return OpenComm(szTmpNamePort, 8192, 8192);

}

Функция OpenCommPort самостоятельно формирует строку с текстовым именем открываемого COM-порта. Строка формируется с помощью функции wsprintf во временном буфере szTmpNamePort.

Размер входной и выходной очереди COM-порта задается равным 8192 байтам, чего вполне достаточно для простых приложений, не поддерживающих протоколы обмена файлами. Затем определенная нами функция возвращает идентификатор открытого порта или отрицательное число в случае ошибки.


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