崔陽

摘 要:針對64位Windows操作系統對HID設備與主機應用程序的通訊造成的新問題,首先簡要介紹了Windows環境下HID設備的性能特點和通訊機制,以此為基礎提出一個面向64位Windows的HID設備通訊接口,并在Wave Panel上進行了編程實驗。結果證明該接口的通用性較強,能夠較好地實現64位Windows下HID設備與主機應用程序的通訊功能。
關鍵詞:HID;通訊接口;中斷傳輸;64位Windows
中圖分類號:TP319 文獻標識碼:A
Abstract:To solve the new problems of communication between human interface devices (HID) and the computer applications caused by 64-bit Windows,characteristics and the communication mechanism of HID in Windows environment are introduced first,based on which a communication interface for 64-bit Windows is designed and programmed on Wave Panel.Results show that communication function in 64-bit Windows environment can be better achieved through the interface.
Keywords:HID;communication interface;interrupt transmission;64-bit Windows
1 引言(Introduction)
HID(Human Interface Device,人機接口設備)是一類低速USB設備,具有使用方便、響應迅速、成本低廉等優點。典型的有鍵盤、鼠標、游戲桿等。
HID設備研發和使用中面臨的重要問題之一是設備與主機應用程序的通訊。Windows 7的發布標志著Windows操作系統開始從32位向64位過渡,因此有必要對64位Windows環境下HID設備通訊程序的一些新問題進行研究。
2 HID設備的性能特點(Performance characteristics of HID)
HID設備雖然也屬于USB設備,但還具備一些自身特點,主要有:
(1)單次傳輸的數據量小,且以設備狀態信息和控制信息為主。單次傳輸數據通常在8字節到1024字節。數據存儲在報表(Report)結構內[1]。
(2)使用輪詢方式。HID設備會在一個設定的時間間隔內檢測一次設備,若發現設備狀態有變化則會生成輸入報表,并發送到主機[2]。
(3)多數采用中斷方式通訊。這種方式適用于周期性、延遲低的數據[3],符合HID設備的應用特點。
3 HID設備的通訊過程(Communication process of HID)
Windows 98及之后的各版本Windows已包含HID驅動程序[4,5],應用程序可直接調用相關API函數實現HID設備的通訊。該過程可分為以下四個模塊:
(1)設備識別和打開。一臺主機有可能同時連接多臺HID設備,因此在通訊前必須確定要進行通訊的設備并打開。HID設備以廠商ID(VID)、產品ID(PID)和產品版本號(PVN)三項屬性值作為其唯一標識[6]。
(2)讀報表。讀報表是指HID設備向主機輸入數據。對以中斷方式發送數據的HID設備而言,應用程序需要創建一個異步調用的讀報表線程。同時為減輕系統負載,該線程在HID設備沒有向主機輸入數據時應阻塞。當有數據輸入時恢復運行,將輸入數據保存在緩沖區中,并進行解析。之后線程將再次阻塞。讀報表線程在應用程序運行結束前將一直存在。
(3)寫報表。寫報表是指主機向HID設備輸出數據。但該功能不是必需的,視HID設備而定[7]。寫報表線程比較簡單,只須將要輸出的數據先復制到一個緩沖區內,然后輸出到HID設備即可。數據通常是一些控制信息和狀態信息[8]。
(4)設備關閉。當主機與HID設備的通訊結束后必須將HID設備關閉。
4 64位Windows環境中HID設備通訊模式 (Communication mode of HID in 64-bit Windows environment)
通過上述討論,Windows環境下HID設備的識別和打開主要是通過調用API函數實現的。但64位Windows操作系統不支持這些API函數,也沒有提供相應的API函數。因此必須對設備識別與打開模塊的功能進行分解。思路是將涉及API函數的設備識別功能與設備打開功能相分離,并在32位環境下將前者編譯為可執行程序,供后者在64位環境下調用。因此,應將設備識別與打開模塊再細分為設備識別和設備打開兩個獨立的功能模塊。
4.1 設備識別
HID設備識別模塊主要是通過調用相關的API函數對主機各USB接口上連接的設備進行三項屬性值對比,完全符合的即為當前要打開的HID設備。用到的API函數主要有HidD_GetHidGuid()、SetupDiGetClassDevs()、SetupDiEnumDeviceInterfaces()、SetupDiGetDeviceInterfaceDetail()、HidD_GetAttributes()、SetupDiDestroyDeviceInfoList()等。
4.2 設備打開
設備打開模塊的功能相對簡單,只需首先從外部文件中獲取設備識別模塊中保存的HID設備路徑,再調用ReadFile()以帶讀寫訪問設置的異步方式將設備打開,并返回設備句柄即可。
4.3 通訊接口的設計和實驗
以上述討論為基礎,設計一個實用的HID設備通訊接口,起名為CHidComm64。該接口包括:
(1)DWORD變量VID、PID和PVN:保存HID設備的三項屬性值。
(2)UCHAR類型數組ReadBuffer和WriteBuffer:分別表示HID設備的輸入報表和輸出報表。
(3)UCHAR類型數組DevicePath,表示HID設備路徑。
(4)ReadReportThread()和WriteReportThread():用于創建讀報表線程和寫報表線程,當HID設備沒有向主機輸入數據時,線程被阻塞;當有數據輸入時,線程恢復運行,這樣就可以降低系統負載、提高運行效率。
(5)成員函數SearchDevice()、OpenDevice()、CloseDevice()函數:分別實現HID設備識別、打開和關閉。
在連接不同的HID設備時,只需要重新設置VID、PID和PVN值以及ReadBuffer、WriteBuffer的長度,不用對HID設備識別、打開、讀寫報表等功能進行修改,從而提高接口的通用性。
實驗以視頻色彩編輯軟件專用HID設備Wave Panel為平臺,編程語言為C++,編譯環境為64位Windows 7操作系統下的Visual Studio 2010。Wave Panel有按鍵、解碼器和二維跟蹤球三種控制器,每40ms對所有控制器輪詢一次。若任何一個控制器的狀態在期間發生變化,就會生成輸入報表發送給主機。同時Wave Panel的液晶屏也可以顯示主機的狀態信息。
圖1是主機應用程序調用CHidComm64接口實現與Wave Panel通訊的界面。應用程序以十六進制形式將Wave Panel發送的數據顯示在界面上,同時顯示控制器狀態變化的情況。
5 結論(Conclusion)
64位Windows操作系統不再支持原有的HID設備通訊API函數,因此有必要對HID設備與主機的通訊流程做出改進。所設計的CHidComm64通訊接口將HID設備識別與設備打開功能相分離,從而能夠較好地實現在64位Windows環境下的通訊功能。今后的工作將主要研究對該接口功能的完善方面。
參考文獻(References)
[1] Device Class Definition for Human Interface [EB/OL]. http://www.usb.org/developers/devclass_docs/HID1_11.pdf.
[2] 胡曉軍,張愛成.USB接口開發技術[M].陜西:西安電子科技大學出版社,2005.
[3] 蔡欣榮.基于ARM的HID類自定義功能鍵盤研究與實現[J].工業控制計算機,2011,24(5):14-18.
[4] 王恒升,匡洋,彭宏道.USBHID類設備小驅動程序開發[J].控制工程,2010,17(6):815-819.
[5] 時向衛,李崢,張少武.Win2000/XP下USB設備驅動程序研究與設計[J].計算機工程與設計,2008,29(21):5562-5565.
[6] Jan AXELSON.USB開發大全(第4版)[M].北京:人民郵電出版社,2011.
[7] 劉力,等.基于HID類的USB人機接口設計[J].計算機工程與科學,2003,25(3):82-85.
[8] 王繼剛,等.虛擬化環境下的USB設備訪問方法[J].計算機應用,2011,31(5):1439-1442.
作者簡介:
崔 陽(1979-),男,博士,講師.研究領域:知識工程與知識發現.