Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 143

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 137 138 139 140 141 142 < 143 > 144 145 146 147 148 149 .. 166 >> Следующая

Последний параметр передает настройки для асинхронного чтения данных. Если объект был открыт с параметром file_flag_overlapped, этот параметр обязательно должен указывать на правильную структуру типа overlapped, если же объект был открыт без использования file_flag_overlapped, то этот указатель обязательно должен быть null.
16.2.1. Дополнительные сведения
В Windows NT/2000/XP можно использовать функцию ReadFileEx для асинхронного чтения данных (см. разд. 16.4).
16.2.2. Возвращаемое значение
Функция завершается, если прочитано необходимое количество байтов или произошла ошибка. Если чтение прошло успешно, возвращается ненулевое значение.
В случае ошибки возвращается 0, а код ошибки можно получить с помощью
вызова GetLastError.
16.2.3. Пример вызова
Листинг 16.2 показывает пример использования функции ReadFiie для синхронного чтения данных.
Глава 16. Базовые функции Windows
475
var
ComHandle : THandle; CurrentState : TComStat; CodeError : Cardinal; PData : Pointer;
AvaibleBytes, RealRead : Cardinal; Begin
ComHandle:= CreateFile(...);
{Возвращает структуру состояния порта и код ошибок} ClearCommError(ComHandle, CodeError, @CurrentState}; { Число полученных, но еще не прочитанных байт} AvaibleBytes:= CurrentState.cblnQue; { Проверка числа доступных байт} If AvaibleBytes > 0 then begin GetMem(PData, AvaibleBytes};
If ReadFiIe(ComHandle, PDataA, AvaibleBytes, RealRead, nil} then begin
{Реально прочитано RealRead байт} End;
FreeMemfPData} ; End;
CloseHandle(ComHandle}; end;
16.3. Функция WriteFile: передача данных
Функция WriteFile производит синхронную или асинхронную запись данных в файл (порт, драйвер).
Формат заголовка WriteFile на языке С имеет следующий вид:
BCOL WriteFile(
HANDLE
LPCVOID
DWORD nNBTW,
LPDWORD nNBW,
LPOVERLAPPED lpOverlapped
hHandle, lpBuffer,
Il дескриптор, полученный от CreateFile
Il буфер данных
// длина буфера
// реально отправленное число байт
// параметры асинхронной записи
476
Часть V. Справочник
Формат заголовка writeFile на языке Delphi имеет следующий вид:
function WriteFile(
hFile : THandle; // дескриптор, полученный от CreateFiie
const Buffer; Il буфер данных
nNBTW : DWORD; Il длина буфера
var IpNBW : DWORD; // реально отправленное число байт
lpOverlapped: POverlapped Il параметры асинхронной записи ): B0OL;
Первый параметр передает дескриптор объекта, полученный с помощью функции CreateFiie. Указатель на буфер данных для записи задается с помощью второго параметра, а размер этого буфера в байтах — с помощью третьего.
Параметр nNBw задает указатель на переменную типа dword, в которую будет записано реально переданное число байтов. В Windows 95/98/МЕ этот параметр не может быть нулевым. В Windows NT/2000/XP этот параметр может быть нулевым, если задан указатель на параметры асинхронной записи lpoveriapped, и не может быть нулевым, если задается синхронная запись, т. е. указатель lpoveriapped нулевой.
16.3.1. Дополнительные сведения
В Windows NT/2000/XP можно использовать функцию writeFiieEx для асинхронной записи данных (см. разд. 16.5).
16.3.2. Возвращаемое значение
Если выполнение успешно, функция WriteFile возвращает ненулевое значение. Если функция завершилась с ошибкой, она возвращает нулевое значение, а КОД ОШИбкИ МОЖНО узнать С ПОМОЩЬЮ ВЫЗОВа GetLastError.
16.3.3. Пример вызова
Листинг 16.3 показывает пример использования функции WriteFile для синхронной записи данных в коммуникационный порт, а листинг 16.4 — пример асинхронной записи.
^Листинг 16.3/Пример испрль'зованйя'-функции^^^^іїв (синхронная запись)
var
FComPortHandle : THANDLE; DataPtг : Pointer; nToWrite, nWrite : Integer;
Глава 16. Базовые функции Windows
477
FComPortHandle:= CreateFile(...); nToWrite:= количество передаваемых байт GetMem(DataPtr, nToWrite); ... заполняем буфер данными ...
WriteFile (FComPortHandle, DataPtr'4, nToWrite, nWrite, nil); FreeMem(DataPtr); CloseHandle(FComPortHandle);
іїЛЙстинг 16.4.Тіример использования функции WriteFile (асинхронная запись)
____" ' * • ^ ^ Л*. а**».*.. і »- . і. .1...-. і.іїп і п т.-. ti.t »v* •»ст. * і і 1?flv.....«.._______....._______________г»____............. .......і.
var
FComHandle : THandle;
AsyncPtr : PAsync;
BytesTrans : DWORD;
FComHandle:= CreateFile(...,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, 0
) ;
{Создание асинхронных параметров} New(AsyncPtr) ; With AsyncPtr'4 do begin
Kind := 0; { 0 - write, 1 - read }
GetMem(Data, Count);
Move(Buffer, DataA, Count);
Size := Count; end;
{Передача данных}
WriteFile(FComHandle, Buffer, Count, BytesTrans, @AsyncPtrA.Overlapped); {Освобождение памяти} Dispose(AsyncPtr) ; CloseHandle(FComHandle);
16.4. Функция ReadFileEx: АРС-чтение данных
Функция ReadFileEx осуществляет асинхронное чтение данных. Работа этой функции похожа на вызов обычной функции ReadFiie в режиме асинхронного чтения, но ReadFileEx поз воля ет программе выполнять другие дейст-
478
Часть V. Справочник
вия во время чтения данных. При завершении чтения будет вызвана специальная callback-процедура.
Предыдущая << 1 .. 137 138 139 140 141 142 < 143 > 144 145 146 147 148 149 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100