博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HIDKomponente使用读写Hid设备一瞥
阅读量:6947 次
发布时间:2019-06-27

本文共 2552 字,大约阅读时间需要 8 分钟。

 

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

转载于:https://www.cnblogs.com/khzide/p/4872888.html

你可能感兴趣的文章
完整性约束
查看>>
docker 17.09.0-ce 启动更换网络地址
查看>>
关于《大道至简》第六章的收获
查看>>
JavaWeb部分面试题
查看>>
mac osx 系统开发php 的一些工具
查看>>
Tcp的三次握手,以及原理详解
查看>>
sprintboot 中占位符及多环境配置
查看>>
Oracle资源
查看>>
你需要一点点CIL
查看>>
Java中的位运算
查看>>
java连接mysql的一个小例子
查看>>
laravel queue 修改之后不生效的坑
查看>>
[USACO07JAN]Balanced Lineup
查看>>
[入门OJ3876]怎样学习哲学
查看>>
陶哲軒實分析 習題3.6.9
查看>>
Python国内豆瓣源
查看>>
html页面的局部刷新
查看>>
C#不常见的语法
查看>>
[摘录]高效人士七习惯—以终为始原则
查看>>
Office Visio简介
查看>>