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