新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Wave Panel的HID設備通訊接口設計

        基于Wave Panel的HID設備通訊接口設計

        作者: 時間:2016-12-20 來源:網絡 收藏

          流程中調用的Windows API 函數和結構體變量類型分別在hidpi. h.hidsdi. h.hidusage. h.setupapi. h 和hid. lib.setupapi. lib 幾個文件中定義并實現 。主要包括:

          1)HidD_GetHidGuid( ):獲取HID 設備的GUID值,并保存在一個GUID 結構體變量中;

          2)SetupDiGetClassDevs():根據HID 設備的GUID值獲取HID 設備信息的集合,并保存在一個HDEVINFO結構體類型的變量中;

          3)SetupDiEnumDeviceInterfaces():在設備信息集合中依次獲取編號為i(i = 0,1,…) 的設備接口信息,保存在一個SP_DEVICE_INTERFACE_DATA 結構體類型變量中;

          4)SetupDiGetDeviceInterfaceDetail():當獲取設備接口信息成功時進一步獲取該設備的詳細信息,并保存設備路徑;

          5)HidD_GetAttributes():獲取設備屬性值并保存在一個HIDD_ATTRIBUTES 結構體類型變量中.VID.PID 和PVN 值即為該結構體變量的三項成員;

          6)SetupDiDestroyDeviceInfoList( ):銷毀設備信息集合。

          2. 2 讀報表

          讀報表是指HID 設備向主機輸入數據。當WavePanel 面板上任意控制器狀態發生變化時,都會在下一次輪詢時將這些數據生成輸入報表,并發送給主機。

          主機上的應用程序接收輸入報表并對數據進行解析,然后做出相應的處理。

          由于Wave Panel 可能在任何時候與主機以中斷方式進行通訊,因此應用程序需要維護一個異步調用的讀報表線程。該線程在Wave Panel 沒有向主機輸入數據時阻塞,以減輕系統負載。當有數據輸入時,線程恢復運行,調用ReadFile()將輸入數據保存在緩沖區中,并對數據進行解析。這之后線程將再次被阻塞,直到有新的輸入數據到來。應用程序在Wave Panel成功打開后就創建讀報表線程,應用程序運行結束前該線程將一直存在。讀報表流程如圖2 所示。

          

          2. 3 寫報表

          與讀報表相反,寫報表是指主機向HID 設備輸出數據。寫報表對延遲的要求較高,但這一功能不是必需的,根據HID 設備的實際用途而定 。鼠標。鍵盤。游戲桿等較簡單的設備只向主機發送數據,這些數據通常是一些控制信息和狀態信息 ,例如改變HID 設備液晶屏上的顯示信息。控制設備上發光元件的亮滅等。

          應用程序的寫報表線程流程與讀報表線程類似,首先將要輸出的數據按Wave Panel 規定的數據格式進行封裝,復制到一個緩沖區內,再調用WriteFile()將緩沖區數據輸出到Wave Panel 即可,這些信息主要是與視頻幀狀態變化相關的信息。

          2. 4 設備關閉

          設備關閉模塊功能比較簡單。當主機與WavePanel 的通訊結束時,調用CloseHandle( ) 將打開的Wave Panel 關閉即可。

          3 Wave Panel 通訊接口的設計

          以上述通訊過程為基礎,設計一個名為CHid-Comm 的通訊接口,其總體框架為:

          

          其中,成員函數OpenDevice()和CloseDevice()分別用于識別。打開和關閉Wave Panel.ReadReport-Thread()用于創建讀報表線程。由于線程為異步方式執行,因此ReadReportThread( ) 在調用ReadFile( ) 時要使用一個OVERLAPPED 結構變量,該變量含有一個I/ O 完成后觸發事件的句柄。當HID 設備沒有向主機輸入數據時,事件處于無信號狀態,線程被阻塞;當有數據輸入時,事件被觸發,線程恢復運行,接收并將數據保存在讀報表緩沖區,供數據解析函數使用.WriteReportThread()與ReadReportThread( ) 的功能類似,用于創建寫報表線程。

          成員變量VID.PID 和PVN 用于保存三項屬性值,ReadBuffer 和WriteBuffer 分別定義讀報表緩沖區和寫報表緩沖區,其大小由HID 設備的輸入報表和輸出報表長度決定.S 實際上,該接口不僅可以用于WavePanel,同樣也適用于其它HID 設備。只需要重新設置VID.PID 和PVN 值以及ReadBuffer.WriteBuffer 緩沖區的大小,而無須對識別。打開。讀寫報表等功能進行修改。

          圖3 是主機應用程序調用CHidComm 接口實現與Wave Panel 通訊的情況。以十六進制形式輸出讀報表緩沖區的值,并顯示控制器狀態變化情況。需要注意的一個重要問題是Wave Panel 輸入報表并不使用報表ID,在這種情況下應將讀報表緩沖區ReadBuffer 的第0 字節設置為0×00,否則讀報表線程將無法接收到輸入報表。

          

          4 結束語

          Wave Panel 是一類較復雜的視頻編輯HID 設備,沒有提供Windows 環境下的通訊功能。基于WavePanel 對Windows 環境下的HID 設備通訊進行研究,能夠解決許多UNIX.Linux.Mac 等操作系統支持的專用HID 設備無法在Windows 環境下使用的問題。較之現有的一些解決方案,設計的CHidComm 接口具有較強的通用性,并可以方便地對功能進行擴展。今后的工作主要是擴展該接口在64 位Windows 環境下的功能.


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 灌阳县| 通州区| 顺昌县| 城步| 西城区| 安达市| 哈巴河县| 政和县| 杭锦旗| 池州市| 温泉县| 南平市| 康保县| 商河县| 资阳市| 洛隆县| 灵璧县| 垫江县| 突泉县| 通山县| 巫山县| 綦江县| 莒南县| 揭阳市| 和平区| 潮州市| 社旗县| 凤台县| 衡山县| 连云港市| 如东县| 新疆| 禄丰县| 仁化县| 阜宁县| 普安县| 康平县| 确山县| 读书| 永新县| 巴青县|