Компьютерные книги
Главное меню
Главная Поиск по сайту Добавить материал О нас Карта книг Карта сайта
Реклама
computersbooks.net -> Добавить материал -> Аппаратное обеспечение -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 125

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

Агуров П.В. Интерфейсы USB. Практика использования и программирования — БВХ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interfeysusbpraktikaispolzovaniya2004.djvu
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 168 >> Следующая

If HidD_GetSerialNumberString(
HidHandle, Buffer, SizeOf(Buffer)) then begin lbLog.Items.Add(Format('
Серийный номер=%э',[Buffer]));
End else begin lbLog.Items.Add(' Ошибка HidO_GetSerialNumberString');
End;
If HidO_GetPreparsedOata(HidHandle, PreparsedData) then begin
HidPjGetCaps(PreparsedData, Capabilities); lbLog.Items.Add(Format(
' UsagePage =%x',[Capabilities.UsagePage]
));
lbLog.Items.Add(Format(
' InputReportByteLength =%d',[Capabilities.InputReportByteLength] ));
lbLog.Items.Add(Format(
394
Часть IV. Создание USB-устройств
' OutputReportByteLength =%d',[Capabilities.OutputReportByteLength] ));
lbLog.Items.Add(Format(
' FeatureReportByteLength=%d',[Capabilities.FeatureReportByteLength
]));
End else begin lbLog.Items.Add(' Ошибка HidD_GetPreparsedData');
End;
If Capabilities.FeatureReportByteLength > 0 then begin
FillChar(InputReport, SizeOf(InputReport), #0);
II InputReport[1]:= 1;
If HidD_GetFeature(HidHandle, InputReport,
Capabilities.FeatureReportByteLength) then begin II отображение
полученных данных S:= ";
For i:= 1 to Capabilities.FeatureReportByteLength-1 do begin S:= s + ' '
+ IntToHex(InputReport[i], 2);
End;
lbLog.Iterns.Add(' Прочитано:' + S);
End else begin lbLog.Items.Add(
' Ошибка HidD_GetFeature ('+SysErrorMessage(GetLastError)+')'); End;
End else begin lbLog.Iterns.Add(' FeatureReport не поддерживается');
End;
If Capabilities.InputReportByteLength > 0 then begin
FillChar(InputReport, SizeOf(InputReport), #0);
If ReadFile(HidHandle, InputReport,
Capabilities.InputReportByteLength, BytesRead, nil) then begin II
отображение полученных данных S:= ";
For i:= 1 to BytesRead do begin S:= S + ' ' + IntToHex(InputReport[i],
2);
End;
lbLog.Items.Add(' Прочитано:' + S);
Глава 13. HID-устройство на основе Atmel АТ89С5131
395
End else begin lbLog. I terns. Add (
' Ошибка ReadFile ('+SysErrorMessage(GetLastError)+')');
End;
End else begin lbLog.Items.Add(' InputReport не поддерживается');
End;
// Освободить блок PreparsedData HidD_FreePreparsedData(PreparsedData);
II Освободить дескриптор устройства CloseHandle(HidHandle); end;
Заметим, что после вызова HidD GetPreparsedData полученный буфер
необходимо освободить С ПОМОЩЬЮ функции HidD_FreePreparsedData.
Запустив программу (ее полный код можно найти на компакт-диске к кни-
ге), мы увидим информацию, показанную на рис. 13.19.
¦- ... ... . .
1 if Чтение данный с HID-устройство В вв
\\Ahid#vid_03eb&pid_5703#6&279d8670&0&0000#{4d1 е55Ь2-П БМ1 cf-88cb-
001111000030} Пробуем открыть HID-устройство. • ^Читать ]|
Устройство открыто в режиме tead/wnte : Устройство открыто в режиме tead
only1 VendorlD=1003, Productl D=22275, VersionNumber=0 Число входных
буФеров=32 npoH3Bcenrenb=PVASoft npcmyKT=FVASoft !es! boatd Серийный
номер=1.0 0 UsagePage =FF00 InputReportByteLength =8 I
OutputReportByteLength =0 FeatureR eportByteLength=0 FeatuieRepoit не
поддерживается Прочитано 01 02 ВЗ 04 05 06 07 00
Рис. 13.19. Окно чтения INPUT-репорта с HID-устройства
Внимательно посмотрев на рисунок, можно заметить, что функция
HidP_GetCaps вернула размер буфера на единицу больше, чем мы описывали в
дескрипторе устройства. Это связано с тем, что в первом байте буфера
передается номер репорта (Report ID). Более подробно этот вопрос мы
рассмотрим в следующих разделах.
396
Часть IV. Создание USB-устройств
В заключение приведем КОД функции GetHIDString для получения строки по ее
идентификатору (листинг 13.43).
. Листинг 13.43. Получение строки по идентификатору // Получение строки
по идентификатору
Function GetHIDString(StrDescriptor : Byte): WideString; var Buffer :
array [0..253] of WideChar; begin Result : = 'Ошибка'; if StrDescriptor
<> 0 then if HidD_GetIndexedString(HidHandle, StrDescriptor,
Buffer, SizeOf(Buffer)) then Result:- Buffer; end;
13.7. Дополнительные функции Windows XP
Как мы уже говорили, для чтения INPUT-репортов используется функция
ReadFile (или ReadFileEx). Windows ХР предоставляет еще одну функцию для
чтения репортов типа INPUT - HidD_GetinputReport. Заголовок этой функции
показан в листинге 13.44.
^^^тинг. 13.44. Функция HidD_GetInputReport ($IFDEF WINXP)
function HidD_GetInputReport(
HidDeviceObject : THandle; // дескриптор устройства
Buffer : Pointer; // буфер
BufferLength : ULONG // размер буфера
): LongBool; stdcall;
($ENDIF)
Так же как и для функции HidD GetFeature, размер буфера должен быть на 1
больше, чем описано в дескрипторе устройства, а нулевой байт - содержать
идентификатор репорта (более подробно мы обсудим идентификаторы репортов
в следующем разделе).
При использовании HidD_GetlnputReport хост посылает устройству запрос get
report с типом запроса INPUT, т. о. для корректного ответа необходи-
Глава 13. HID-устройство на основе Atmel АТ89С5131
397
мо обрабатывать этот запрос, как мы это делали в листинге 13.39. Пример
вызова HidD_GetInputReport приведен в листинге 13.45, а полный пример
можно найти на компакт-диске к книге.
Предыдущая << 1 .. 119 120 121 122 123 124 < 125 > 126 127 128 129 130 131 .. 168 >> Следующая
Книги
Web-программирован-
ие
Аппаратное обеспечение Графика Руководство по П.О. Самоучитель Теория программирования Фотошоп Языки программирования
Новые книги
Вирт Н. "Систематическое программирование " (Теория программирования)

Эком "Microsoft Excel 2000 шаг за шагом Русская версия самоучитель " (Самоучитель)

Поляков А.Ю. "Методы и алгоритмы компьютерной графики в примерах Vizual C++" (Графика)

Баяковский Ю.М. "Графическая библиотека Open GL " (Графика)

Валиков А. "Технология " (Языки программирования)
Авторские права © 2013 ComputersBooks. Все права защищены.