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