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
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM