Шаг 97 - CreateFile и HANDLE порта

Итак, функции для работы с портом используют указатель на порт. То есть Вы создаете этот указатель, и если он создан (не NULL), то используя его можно управлять устройством. Как раз CreateFile() и умеет создавать указатель для порта.

97.gif (7423 b)

Посмотрите на рисунок. Мы используем CreateFile() для получения HANDLE, с помощью которого потом и производим операции ввода-вывода на устройство. После работы его нужно закрыть CloseHandle(). Сама эта функция CreateFile() такая:

HANDLE CreateFile
( 
	LPCTSTR lpFileName,
	DWORD dwDesiredAccess,
	DWORD dwShareMode,
	LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDistribution,
	DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile 
); 

В нашем случае lpFileName - это имя порта:

LPT1 , LPT2 и так далее
COM1, COM2, и так далее.

Переменная dwDesiredAccess - это атрибут доступа файлу. Он может принимать такие значения:

0 получить атрибут 
GENERIC_READ чтение 
GENERIC_WRITE запись 
GENERIC_READ|GENERIC_WRITE чтение и запись

DwShareMode - совместный доступ, для данного случая доступа к портам всегда равен 0.

LpSecurityAttributes - атрибут защиты. Нужен для NT, в нашем случае всегда равен OPEN_EXISTING.

DwFlagsAndAttributes - атрибут создаваемого файла, в нашем случае должен быть 0.

HTemplateFile - файл шаблона, для нас всегда NULL.

Итак, для работы с портами нужно уставить только lpFileName, dwDesiredAccess, LpSecurityAttributes. При нормальном выполнении мы получим HANDLE, в противном случае NULL.

// TestComm.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "iostream.h"

void main()
{
	HANDLE Com2Port; 
	Com2Port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,
		NULL,OPEN_EXISTING,0,NULL);
	if(Com2Port!=INVALID_HANDLE_VALUE) 
	{
		cout << "Open COM 2 " << endl;
		CloseHandle(Com2Port);
	} else
		cout << "Error Open COM2" << endl;
}

Имейте в виду, что Вы не можете открыть порт, если с ним работают, например, мышиный. Но если у Вас получилось, то другая программа не сможет обратиться к порту. Кроме того порта может не быть или другая программа просто не освободила указатель или повесила его. Итак, какие могут быть ошибки:

Занят.
Отсутствует.
Выведен из строя.

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 8.03.2001