摘 要:HID 設備研發和使用中所面臨的重要問題之一是設備與主機應用程序的通訊。文中以視頻編輯專用HID 設備Wave Panel 為基礎,首先簡要介紹了HID 設備的性能特點和Windows 環境下的HID 通訊機制,在此基礎上設計出一個實用的HID 設備通訊接口,該通訊接口利用相關Windows API 函數實現對HID 設備的識別。打開和關閉,并以異步模式完成設備與主機應用程序的雙向通訊過程,最后在Wave Panel 對該接口進行了編程實驗。實驗結果證明該接口的通用性較好,能夠較好地實現HID 設備與主機應用程序的通訊功能。
引 言
HID(Human Interface Device,人機接口設備)是一類低速USB 設備,典型的HID 設備有鍵盤。鼠標。游戲桿等。相對于U 盤。打印機等高速USB 設備,HID 設備具有使用方便。響應迅速。研發成本低廉等優點,其應用領域十分廣泛。當前HID 設備正在向專用化方向快速發展 。
Wave Panel 是蘋果公司研發的視頻色彩編輯軟件Color 支持一型專用的數據輸入和顯示HID 設備,該設備面板上設置有按鍵。解碼器和二維跟蹤球三種控制器,能夠快捷。精確地對各類視頻色彩參數進行設置,并將控制和狀態信息同步顯示在設備微型顯示屏上,從而改變了傳統“鼠標+鍵盤”的視頻編輯軟件控制方式.Wave Panel 沒有提供Windows 環境下與應用程序通訊的功能,因此可基于Wave Panel 設計一個功能完備。通用性強的通訊接口,并加以驗證。這對企業和科研機構根據實際需求靈活地配備和控制專用HID 設備有很大幫助。
1 ?Wave Panel 的性能特征
HID 設備除滿足USB 標準外,還具備一些與人機交互密切相關的特點,主要包括:
1)通常使用控制方式或中斷方式通訊。兩種傳輸方式的區別在于控制方式適用于對延遲沒有特別限制的數據,而中斷方式適用于低延遲。周期性的數據 .Wave Panel 的數據傳輸方式為中斷方式。
2)單次傳輸的數據量小,且這些數據以狀態變化信息或控制信息為主。其中低速HID 設備單次傳輸數據最大為8 字節,全速設備為64 字節,高速設備為1024 字節。主機與HID 設備交換的數據存儲在報表(Report)結構內 。
Wave Panel 的輸入報表長度為27 字節,其中0 字節用于記錄報表ID,1 ~ 6 字節的前41 比特分別記錄41 個按鍵的按下或抬起狀態,另有7 比特未用,置為0;7 ~19 字節分別記錄13 個解碼器的狀態;20 ~25 字節每2 字節分別記錄一個二維跟蹤球X 軸和Y 軸的狀態;26 字節留作固件升級使用.Wave Panel 的輸出報表長度為41 字節,其中0 ~ 5 字節為控制命令,6 ~ 40字節為顯示信息的字符。
3)使用輪詢方式檢測設備狀態變化情況.HID 設備可能在任何時刻向主機發送數據,例如鼠標發生移動或鍵盤有按鍵按下。所以HID 設備會在一個固定的時間間隔內輪詢各控制口一次,當發現設備狀態有變化時生成輸入報表發送給主機 。但輪詢的間隔時間要由用戶對HID 設備的操作速度決定。如果間隔時間過小,則用戶來不及在兩次輪詢間隔內完成一次操作;反之,又會使HID 設備的響應速度無法與用戶的操作速度匹配,造成延遲 。
Wave Panel 規定,每40 毫秒對所有控制器端口輪詢一次,若其中任何一個控制器的狀態在兩次輪詢間隔內發生改變,就會在下次輪詢前生成輸入報表發送給主機.40 毫秒是基于視頻每幀顯示時間而確定的。
2? HID 設備的通訊過程
HID 設備是Windows 操作系統最早支持的USB設備。在Windows 98 及以后的各版本中都已內置了HID 設備的驅動程序,主機與HID 設備通訊時無須再編寫專門的驅動程序。這就簡化了HID 設備與主機應用程序通訊接口的設計和研發。
通過分析,可以將HID 設備與主機應用程序的通訊劃分為設備識別和打開。讀報表。寫報表和設備關閉四個模塊。
2. 1 Wave Panel 的識別和打開
HID 設備連接到主機后,以廠商ID(VID)。產品ID(PID)和產品版本號(PVN)三項屬性值的組合作為設備唯一標識.Wave Panel 的三項屬性值可以從產品說明書直接獲取。由于一臺主機可能同時連接有多臺HID 設備,所以在通訊前應用程序必須要識別并打開Wave Panel,這一過程需要調用多個Windows API函數實現?;痉椒ㄊ鞘紫全@取當前與主機連接的所有HID 設備信息的集合,然后逐一枚舉集合中的各設備,并比較VID.PID 和PVN 值。當三項屬性值都與Wave Panel 相等時表示已經找到,調用CreateFile()將該Wave Panel 打開,并保存Wave Panel 設備句柄。該模塊的流程如圖1 所示。
流程中調用的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 設備液晶屏上的顯示信息??刂圃O備上發光元件的亮滅等。
應用程序的寫報表線程流程與讀報表線程類似,首先將要輸出的數據按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 環境下的通訊功能?;赪avePanel 對Windows 環境下的HID 設備通訊進行研究,能夠解決許多UNIX.Linux.Mac 等操作系統支持的專用HID 設備無法在Windows 環境下使用的問題。較之現有的一些解決方案,設計的CHidComm 接口具有較強的通用性,并可以方便地對功能進行擴展。今后的工作主要是擴展該接口在64 位Windows 環境下的功能.
評論