源:HIDKomponente使用读写Hid设备一瞥

HIDKomponente 是delphi中使用的第三方Hid控件库,可以检测、控制连接到电脑的Hid设备。一般情况下多为usb设备。 HIDKomponente的使用实际上很简单,只是因为第一次使用,遇到些问题。它的demo很丰富,很实用。 要使用HIDKomponente库,只需要安装HidController.dpk,并且在单元中添加引用JvHidControllerClass。 使用示例:     在窗体上放置一个TJvHidController。我们要用到的事件有:

        OnArrival
OnDeviceChange
OnDeviceData
OnRemoval

其它事件,这里就不使用了。当然,这是有前提的:就是你要确保你传输的数据的正确性,也就是不能出现无效数据。          在HIDKomponente库中TJvHidDevice表示一个Device,即一个hid设备。通过此对象你可以获得设备的详细信息。比如,     HidDev.Attributes.VendorID 表示设备的 VID,     HidDev.Attributes.ProductID 表示设备的 PID等等          所以在OnArrival事件中,可以指定我们需要的设备

    if (HidDev.Attributes.VendorID = USB_VID) and (HidDev.Attributes.ProductID = USB_PID) then
begin
AddLog(Format('设备已安装.【%s ; %s】', [HidDev.ProductName, HidDev.SerialNumber]));
end;

在OnDeviceChange事件中CheckOut设备。

    if HidDevs.CheckOutByID(FHidDev, USB_VID, USB_PID) then
begin
FHidDev.NumInputBuffers := SizeOf(TReport);
FHidDev.NumOverlappedBuffers := SizeOf(TReport);
end;

什么是CheckOut?CheckOut有7个重载方法,可以查看JvHidControllerClass源码或帮助文件。此方法的功能是让你的应用程序控制设备。在CheckOut后,     TJvHidDevice(示例中的FHidDev)将开启读取线程TJvHidDeviceReadThread。TJvHidDeviceReadThread线程用来读取TJvHidDevice中的report。可以看出     TJvHidDevice是异步操作的。既然使用了异步方式读取数据,那么查看TJvHidDeviceReadThread的Execute方法,可以看过,如果读取到数据,那么会调用     DoData方法,而此方法调用Device的OnData属性事件。而OnData是被赋值为DataEvent(参看:procedure TJvHidDeviceController.SetDevData(const DataEvent: TJvHidDataEvent)),所以对于数据的接收(读取),我们直接使用OnDeviceData事件。          OnRemoval事件在hid设备被拔掉之后触发。这里我们要释放对设备的控件,CheckIn。

if (HidDev.Attributes.VendorID = USB_VID) and (HidDev.Attributes.ProductID = USB_PID) then
begin
if (Assigned(FHidDev)) and (not FHidDev.IsPluggedIn) then
begin
HidDevs.CheckIn(FHidDev);
end;
FHidDev := nil;
DeviceEnabled;
AddLog('设备已移除', ltError);
end;

基本上差不多了。再来说下写入数据。写入数据使用TJvHidDevice的WriteFile方法,当然,还有其它的方法。     WriteFile(var Report; ToWrite: DWORD; var BytesWritten: DWORD)     第一个参数为字节数组,一般设定为65字节。如:

        TReport = packed record
ReportID: byte;
Data: array[0..64] of byte;
end;

ReportId一般为0。     第二个参数ToWrite为需要写入的数据长度。一般使用Device.Caps.OutputReportByteLength     第三个参数BytesWritten为实际写入的字节数据。一般忽略此值。          写入之后就是读取,使用TJvHidDevice的ReadFile(或其它方法)读取与TJvHidController的OnDeviceData读取的区别是,OnDeviceData事件读取到的数据忽略第一个字节,即ReportID。     若同时使用ReadFile(或其它方法)与OnDeviceData,那么,首先是ReadFile然后是OnDeviceData。Readfile方法进行一次读取,而OnDeviceData会不断的将数据读取出来。如果     发送一个命令之后返回的Report太大(大于设定的 InputReportByteLength),那么最好是使用OnDeviceData事件读取数据。          注意事项:         在进行数据通迅时需要定义Report的大小,此大小由设备提供。定义之后在输入或输出数据时一定要使用此大小的数据包,不然,TJvHidController或TJvHidDevice在读取数据时就会出错,无法读取到有效数据。

  Hid设备数据检测工具 Bus Hound

HIDKomponente使用读写Hid设备(转)的更多相关文章

  1. HIDKomponente使用读写Hid设备一瞥

    HIDKomponente 是delphi中使用的第三方Hid控件库,可以检测.控制连接到电脑的Hid设备.一般情况下多为usb设备.HIDKomponente的使用实际上很简单,只是因为第一次使用, ...

  2. C# 访问USB(HID)设备

    原文:C# 访问USB(HID)设备 二话不说,直接给代码,如果您真想做这方面的东西,还是稍微研究下,没有现成的好类用,就需要自己了解其原理 //引用空间 using System; using Sy ...

  3. 第五章 HID设备

    5.1 HID介绍 为简化USB设备的开发过程,USB提出了设备类的概念.所有设备类都必须支持标准USB描述符和标准USB设备请求.如果有必要,设备类还可以自行定义其专用的描述符和设备请求,这分别被称 ...

  4. Android USB Host 与 Hid 设备通信bulkTransfer()返回-1问题的原因

    近期一直在做Android USB Host 与USB Hid设备(STM32FXXX)的通信,遇到了很多问题.项目源码以及所遇到的其他问题可以见本博客其他相关文章,这里重点讲一下bulkTransf ...

  5. android usb host 读写USB设备

    自android3.1以后android增加了操作USB设备的API. 官网地址:http://developer.android.com/guide/topics/connectivity/usb/ ...

  6. android usb Host模式下与usb Hid 设备的通信

    做android 与USB HID设备的通信有段时间了,总结一下遇到的问题和解决方法: 1,第一次遇到的问题:android 版本低不支持usb hid, 被要求做相关项目的时候,就从mUsbMana ...

  7. [Android] hid设备按键流程简述

    hexdump /dev/hidraw0就能看到usbhid设备传输过来的裸流 如:按下Input键 003ae60 0000 0096 8000 006b 0000 0000 0000 0000 * ...

  8. Windows与自定义USB HID设备通信说明.

    1 .   所使用的典型 Windows API CreateFile ReadFile WriteFile 以下函数是 DDK 的内容: HidD_SetFeature HidD_GetFeatur ...

  9. USB自定义HID设备实现-LPC1768

    首先在之前鼠标的基础上修改设备描述符 #include "usbdesc.h" //usb标准设备描述符 const U8 USB_DeviceDescriptor[] = { U ...

随机推荐

  1. hahah

    ۣۣۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖۖ ...

  2. Chapter 1 First Sight——17

    Once I got around the cafeteria, building three was easy to spot. 我一走出自助餐厅,很容易看见建筑三. A large black & ...

  3. Chapter 1 First Sight——11

    I didn't relate well to people my age. 我没有向人们叙述清楚我的年龄 Maybe the truth was that I didn't relate well ...

  4. ZABBIX自定义用户KEY与参数USERPARAMETERS监控脚本输出

    zabbix在模板中预定义了一些key,但通常情况,并不能满足我们的需求.幸运的是zabbix提供了自定义key的方法,因此我们可以灵活的监控各种我们想要监控的数据. 定义配置文件 通过yum安装的z ...

  5. CF 675 div2C 数学 让环所有值变为0的最少操作数

    http://codeforces.com/contest/675/problem/C 题目大意: 给一个环,标号为1-n,然后能从n回到1.让这个环的值为0,最少需要的操作数是多少? 这道题目呀.. ...

  6. C++零食:使用Unicode版的预定义宏__FUNCTION__

    在C++中支持一种预定义宏.比如: __FILE__: 就是当前源代码文件名 __LINE__: 就是当前源代码的行号 这些宏可以在printf等语句中直接作为字符串使用,调试的时候很方便. 如下代码 ...

  7. <a href="#" onclick="history.back();"></a>这样写为什么是对的? -(转)

    为什么不用这样写?<a href="#" onclick="javascript:history.back();"></a> 正解是: ...

  8. 常用的dos命名

    注销:logoff 注册表:regedit 查看显存:dxdiag 删除文件: del +文件 删除文件夹: rd+(/s)+文件名 (/s表示删除文件下的子目录和文件); 系统配置实用程序: msc ...

  9. android脚步---不同activity之间参数传递

    现在有两个activity,一个是mainactivity,一个是detectactivity 后者需要调用前者的一个参数,这里用到了intent  getextras(); putextras(); ...

  10. nano编辑器的设置

    1.取消nano的默认编辑 自己的虚拟机ubuntu不知道怎么搞的,在添加定时任务的时候总是 编辑,一开始不知道,百度了以下这个是所谓的nano,在定时任务的时候总是默认出来,自己习惯了vi,nano ...