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