




已閱讀5頁(yè),還剩55頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
基于基于 HID 的人機(jī)接口設(shè)備的設(shè)計(jì)及應(yīng)用的人機(jī)接口設(shè)備的設(shè)計(jì)及應(yīng)用 摘摘 要要 通用串行總線 USB 是連接計(jì)算機(jī)系統(tǒng)與外部設(shè)備的一個(gè)串口總線標(biāo)準(zhǔn) 也是輸入 輸出接口的技術(shù)規(guī)范 被廣泛應(yīng)用于個(gè)人電腦和移動(dòng)設(shè)備等信息通訊產(chǎn)品 并擴(kuò)展至攝 影器材 數(shù)字電視 機(jī)頂盒 游戲機(jī)等相關(guān)領(lǐng)域 HID Human Interface Device 類(lèi)設(shè)備是 USB 設(shè)備類(lèi)型中的一種 是直接與人交互的設(shè)備 如鍵盤(pán) 鼠標(biāo)等 HID 類(lèi)設(shè)備并不一定是標(biāo)準(zhǔn)的外設(shè)類(lèi)型 只要交換的數(shù)據(jù)格式存儲(chǔ)在報(bào) 文的結(jié)構(gòu)中 并且設(shè)備固件支持報(bào)文的格式 則任何工作在該限制之內(nèi)的設(shè)備均可稱(chēng)為 HID 設(shè)備 如電壓計(jì) 溫度計(jì) 讀卡器等 因此 人機(jī)接口設(shè)備有巨大的應(yīng)用市場(chǎng) 針對(duì)以上需求 本文致力于開(kāi)發(fā)一個(gè)基于 HID 的人機(jī)接口設(shè)備 在上位機(jī)編寫(xiě)相應(yīng)的應(yīng) 用軟件 實(shí)現(xiàn)人機(jī)接口設(shè)備與主機(jī)的通信 本文首先闡述了開(kāi)發(fā)基于 HID 的人機(jī)接口設(shè)備在經(jīng)濟(jì)和技術(shù)上的意義 繼而描述了系 統(tǒng)架構(gòu) 基于 VC 的上位機(jī)軟件開(kāi)發(fā) 以及設(shè)備端固件代碼的編寫(xiě) 文中對(duì) USB 接口通信 協(xié)議做了簡(jiǎn)要的介紹 并介紹了基于 VC 的 Windows 下 USB 接口驅(qū)動(dòng)軟件開(kāi)發(fā) 最后 本文對(duì)在研究和開(kāi)發(fā)人機(jī)接口設(shè)備工作中的不足之處和需要改進(jìn)的地方進(jìn)行了總 結(jié) 同時(shí)也展望了低成本的人機(jī)接口設(shè)備的市場(chǎng)潛力和 USB 發(fā)展的美好前景 關(guān)鍵詞 HID 類(lèi) 人機(jī)接口設(shè)備 USB 通信協(xié)議 HID device based on HID class ABSTRACT Universal Serial Bus is a serial bus standard which connects the computer system and the peripheral equipments It is the input output interface specification as well It is widely used in communication products such as personal computers and mobile devices It is extending to the related fields such as Camera Equipment Digital Television STB and Game Console HID class which short for Human Interface Device is one of the USB device class As we know the Typical HID device are mouse keyboard etc HID class device didn t always be the standard USB device If only the data format is contained by the report structure which is supported by the USB firmware Then we can call all of those devices as HID device such as Voltmeter Thermometer Card reader and so on Therefore the human interface device has a vast potential market So as this this project aims to develop a HID device based on HID class To implement the communication between PC host and the device I need to program the PC application program software etc Firstly this paper set forth the economic and technical importance of the HID device based on HID class And then describe the system framework Also briefly describe the USB specification This paper concludes the shortage during the developing And also prospect the bright future for the low cost HID device Key words HID class HID USB specification 目 錄 摘 要 I ABSTRACT II 1 緒 論 1 1 1 選題背景 1 1 2 選題目標(biāo) 1 1 3 需求分析 2 1 3 1 用戶(hù)需求分析 2 1 3 2 功能需求分析 2 1 4 主要內(nèi)容 2 1 5 本章小結(jié) 3 2 USB 接口技術(shù)介紹 4 2 1 USB 接口技術(shù) 4 2 1 1 USB 簡(jiǎn)介 4 2 1 2 USB 的總線拓?fù)浣Y(jié)構(gòu) 4 2 1 3 USB 系統(tǒng)分層 5 2 1 4 USB 的編碼方式 6 2 1 5 USB 的即插即用 7 2 2 USB 接口 HID 設(shè)備類(lèi) 7 2 2 1 HID 設(shè)備類(lèi)簡(jiǎn)介 7 2 2 2 HID 數(shù)據(jù)傳輸方式 8 2 2 3 HID 設(shè)備枚舉過(guò)程 8 2 2 4 HID 設(shè)備類(lèi)描述符 9 2 3 本章小結(jié) 10 3 人機(jī)接口設(shè)備系統(tǒng)設(shè)計(jì) 11 3 1 系統(tǒng)框架 11 3 2 人機(jī)接口設(shè)備平臺(tái)簡(jiǎn)介 12 3 2 1 USB 控制器方案 12 3 2 2 ST2211U 芯片簡(jiǎn)介 13 3 3 主要功能 14 3 4 本章小結(jié) 14 4 基于 VC 的 HID 上位機(jī)軟件開(kāi)發(fā) 15 4 1 Windows 驅(qū)動(dòng)程序模式 15 4 1 1 Windows 驅(qū)動(dòng)方式 15 4 1 2 WDM 驅(qū)動(dòng)程序的分層結(jié)構(gòu) 15 4 2 USB 接口 HID 類(lèi)驅(qū)動(dòng)原理 16 4 2 1 USB 設(shè)備驅(qū)動(dòng)體系 16 4 2 2 與 HID 設(shè)備通信的主要 API 函數(shù) 17 4 3 基于 VC 的應(yīng)用程序開(kāi)發(fā) 18 4 3 1 開(kāi)發(fā)流程 18 4 3 2 打開(kāi)設(shè)備功能模塊 19 4 3 3 LCD 顯示功能模塊 23 4 3 4 鍵盤(pán)功能模塊 23 4 4 本章小結(jié) 24 5 HID 設(shè)備軟硬件設(shè)計(jì)與實(shí)現(xiàn) 25 5 1 HID 設(shè)備系統(tǒng)設(shè)計(jì) 25 5 2 HID 功能模塊設(shè)計(jì)與實(shí)現(xiàn) 25 5 2 1 USB HID 驅(qū)動(dòng)開(kāi)發(fā) 25 5 2 2 LCD 驅(qū)動(dòng)開(kāi)發(fā) 29 5 2 3 鍵盤(pán)驅(qū)動(dòng)開(kāi)發(fā) 30 5 3 本章小結(jié) 32 6 整機(jī)系統(tǒng)調(diào)試 33 6 1 調(diào)試流程 33 6 2 Bus Hound 調(diào)試工具簡(jiǎn)介 33 6 3 HID 設(shè)備接口通信調(diào)試 33 6 4 基于 VC 的應(yīng)用軟件調(diào)試 34 6 5 測(cè)試結(jié)果 36 7 總結(jié)與展望 39 參考文獻(xiàn) 40 附 錄 41 謝 辭 54 1 緒 論 1 1 選題背景 隨著計(jì)算機(jī)硬件飛速發(fā)展 外圍設(shè)備日益增多 鍵盤(pán) 鼠標(biāo) 調(diào)制解調(diào)器 打印機(jī) 掃描儀早已為人所共知 數(shù)碼相機(jī) MP3隨身聽(tīng)接踵而至 這么多的設(shè)備 如何接入個(gè)人 計(jì)算機(jī) 為了滿足用戶(hù)的需求 以Intel 為首的七家公司 Intel Compaq Microsoft IBM DEC Northern Telecom 以及日本NEC 于1994 年11月推出了USB Universal Serial Bus 通用串行總線 協(xié)議的第一個(gè)草案專(zhuān)用于低中速的計(jì)算機(jī)外設(shè) USB可把多達(dá)127個(gè)外設(shè)同時(shí)連到用戶(hù)的系統(tǒng)上 所有的外設(shè)通過(guò)協(xié)議來(lái)共享USB的帶 寬 其12Mbps的帶寬對(duì)于鍵盤(pán)鼠標(biāo)等低中速外設(shè)是完全足夠的 USB允許外設(shè)在主機(jī)和其 它外設(shè)工作時(shí)進(jìn)行連接配置使用及移除 即所謂的即插即用 Plug 2 獲得指向 HID 設(shè)備集合句柄 SetupDiGetClassDevs 函數(shù)查詢(xún)所有已安裝的 HID 設(shè)備 得到一個(gè)指向該 HID 設(shè)備集 合的句柄 SetupDiGetClassDevs IN LPGUID ClassGuid OPTIONAL IN PCSTR Enumerator OPTIONAL IN HWND hwndParent OPTIONAL IN DWORD Flags 3 識(shí)別 HID 接口 SetupDiEnumDeviceInterfaces 函數(shù)用來(lái)讀取識(shí)別一個(gè)接口的結(jié)構(gòu)的指針 每一次調(diào)用 必須傳遞一個(gè)數(shù)組索引來(lái)指定一個(gè)接口 SetupDiEnumDeviceInterfaces IN HDEVINFO DeviceInfoSet IN PSP DEVINFO DATA DeviceInfoData OPTIONAL IN LPGUID InterfaceClassGuid IN DWORD MemberIndex OUT PSP DEVICE INTERFACE DATA DeviceInterfaceData 4 獲取目標(biāo)設(shè)備詳細(xì)信息 對(duì)每一個(gè)接口 調(diào)用 SetupDiGetDeviceInterfaceDetail 函數(shù)獲取其詳細(xì)的信息 包括 設(shè)備名稱(chēng) 頭四個(gè)字節(jié) CreateFile 用此設(shè)備名打開(kāi)設(shè)備 SetupDiGetDeviceInterfaceDetail IN HDEVINFO DeviceInfoSet IN PSP DEVICE INTERFACE DATA DeviceInterfaceData OUT PSP DEVICE INTERFACE DETAIL DATA A DeviceInterfaceDetailData OPTIONAL IN DWORD DeviceInterfaceDetailDataSize OUT PDWORD RequiredSize OPTIONAL OUT PSP DEVINFO DATA DeviceInfoData OPTIONAL 5 打開(kāi)設(shè)備 調(diào)用 CreatFile 函數(shù)打開(kāi)設(shè)備 CreateFile LPCSTR lpFileName DWORD dwDesiredAccess DWORD dwShareMode LPSECURITY ATTRIBUTES lpSecurityAttributes DWORD dwCreationDisposition DWORD dwFlagsAndAttributes HANDLE hTemplateFile 6 獲取 USB 設(shè)備的有關(guān)屬性 調(diào)用 HidD GetAttributes 獲取設(shè)備的零售商 ID 產(chǎn)品 ID 及產(chǎn)品的版本號(hào)等 如果獲 取成功 則將屬性中的 VID PID 以及設(shè)備版本號(hào)與我們的目標(biāo)設(shè)備進(jìn)行比較 如果一致 則是目標(biāo)設(shè)備 則使用讀寫(xiě)方式打開(kāi)目標(biāo)設(shè)備 BOOLEAN stdcall HidD GetAttributes IN HANDLE HidDeviceObject OUT PHIDD ATTRIBUTES Attributes 7 釋放設(shè)備信息集合 SetupDiDestroyDeviceInfoList 函數(shù)釋放設(shè)備節(jié)點(diǎn)及內(nèi)存分配 WINSETUPAPI BOOL WINAPI SetupDiDestroyDeviceInfoList IN HDEVINFO DeviceInfoSet 圖 4 4 即為 VC 中調(diào)用 Windows API 函數(shù)打開(kāi) HID 設(shè)備的流程圖 開(kāi)開(kāi)始始 使使用用HidD GetHidGuid 得得到到HID類(lèi)類(lèi)GUID 結(jié)結(jié)束束 錯(cuò)錯(cuò)誤誤號(hào)號(hào)是是 ERROR NO MORE ITEMS 使使用用SetupDiEnumInterfaceDevice 枚枚舉舉設(shè)設(shè)備備接接口口 使使用用SetupDiEnumDeviceInterfaces 取取得得設(shè)設(shè)備備接接口口詳詳細(xì)細(xì)信信息息 成成功功 是是否否需需要要操操作作設(shè)設(shè)備備 N 使使用用SetupDiGetClassDev 得得到到HID設(shè)設(shè)備備類(lèi)類(lèi)信信息息 利利用用上上一一步步取取得得的的設(shè)設(shè)備備路路徑徑信信息息 使使用用CreateFile打打開(kāi)開(kāi)設(shè)設(shè)備備 使使用用Hid GetAttributes 取取得得VID PID等等信信息息 使使用用GetLastError Y N 圖 4 4 打開(kāi)設(shè)備流程圖 在完成打開(kāi)設(shè)備功能之后 主機(jī)便可與 HID 設(shè)備進(jìn)行通信了 主機(jī)在接收?qǐng)?bào)告的時(shí) 候 需要從報(bào)告中提取數(shù)據(jù) 由于報(bào)告中包含了各種類(lèi)型的數(shù)據(jù) 為了便辨別不同類(lèi)型 的數(shù)據(jù) HID 類(lèi)提供了 HidP GetXxx 例程 從設(shè)備中讀取不同類(lèi)型的數(shù)據(jù) 如果程序員 知道各個(gè)數(shù)據(jù)的含義 則可直接使用 ReadFile 函數(shù)讀出數(shù)據(jù) 同樣 主機(jī)發(fā)送數(shù)據(jù)給設(shè) 備的時(shí)候 也要先創(chuàng)建報(bào)告 為了方便發(fā)送不同類(lèi)型的數(shù)據(jù)給設(shè)備 HID 類(lèi)提供了 HidP SetXxx 函數(shù) 當(dāng)然 如果程序員知道各個(gè)數(shù)據(jù)的含義 也可以直接使用 WriteFile 函數(shù)將報(bào)告?zhèn)鹘o設(shè)備 在 LCD 顯示與鍵盤(pán)鍵盤(pán)功能模塊上 我們使用 HidD SetFeature 來(lái)傳送一個(gè)特征報(bào)文給 HID 設(shè)備 HidD SetFeature IN HANDLE HidDeviceObject IN PVOID ReportBuffer IN ULONG ReportBufferLength 4 3 3 LCD 顯示功能模塊 LCD 顯示功能模塊 首先用函數(shù) GetDlgItemText 從文本框獲取用戶(hù)輸入信息 并設(shè) 置報(bào)告緩沖區(qū)第 1 字節(jié)為 0 x01 自定義 開(kāi)啟 LCD 顯示功能 主要代碼如下 ReportBuffer 0 0 x00 ReportBuffer 為報(bào)文緩沖區(qū) ReportBuffer 1 0 x01 Display command ReportBuffer 2 sendLen HidD SetFeature hDevHandle ReportBuffer 0 x21 讀寫(xiě)報(bào)文緩沖區(qū)時(shí) 第一個(gè)字節(jié)是 Report ID 其后是報(bào)文數(shù)據(jù) 報(bào)文緩沖區(qū)默認(rèn)是 八個(gè)報(bào)文 并且環(huán)狀排列 因?yàn)閿?shù)據(jù)讀寫(xiě)是發(fā)生在主機(jī)輪訓(xùn)設(shè)備的時(shí)候 并不是由設(shè)備 觸發(fā)產(chǎn)生硬件中斷 所以如不能及時(shí)讀寫(xiě) 新的數(shù)據(jù)會(huì)覆蓋舊的數(shù)據(jù) 導(dǎo)致生報(bào)文丟失 當(dāng)數(shù)據(jù)讀寫(xiě)頻繁時(shí)應(yīng)使用特征報(bào)文 它可以保證當(dāng)報(bào)文數(shù)據(jù)沒(méi)有變化時(shí) HID 不會(huì)傳送新 的數(shù)據(jù) 當(dāng)設(shè)備接收到該命令 設(shè)備將啟動(dòng) LCD 功能模塊顯示最多 30 個(gè)字符到 LCD 屏上 LCD 命令定義 見(jiàn)表 4 2 表 4 2 LCD 命令定義 偏移量域大小 字節(jié) 值描述 00hbLCDCmd101h LCD 顯示命令 01hbLength1 定義顯示字符的長(zhǎng)度 02habDatabLength 顯示在 LCD 上的字符 03h bLengthabRandomData29 bLength 隨機(jī)數(shù) 4 3 4 鍵盤(pán)功能模塊 鍵盤(pán)功能模塊 可啟動(dòng)開(kāi)發(fā)板的鍵盤(pán)功能 并讀取鍵值 需將報(bào)告緩沖區(qū)第 1 字節(jié) 設(shè)置為 0 x02 自定義 主要代碼如下 ReportBuffer 0 0 x00 ReportBuffer 1 0 x02 Read key command HidD SetFeature hDevHandle ReportBuffer 0 x21 當(dāng) HID 設(shè)備接收到該命令 設(shè)備將在 LCD 上顯示 Enter Data 以提示用戶(hù) 并調(diào) 用按鍵功能模塊等待用戶(hù)輸入按鍵 用戶(hù)只能輸入 0 9 之間的按鍵 但輸入的按鍵達(dá)到 最大長(zhǎng)度 6 或者有 Enter 鍵按下時(shí) 設(shè)備返回所有所按的按鍵給 PC 讀取鍵值流程結(jié)束 按鍵命令定義見(jiàn)表 4 3 表 4 3 按鍵命令定義 偏移量域大小 字節(jié) 值描述 00hbKeyCmd102h 讀鍵值命令 01habRandomData31 31 個(gè)字節(jié)的隨機(jī)數(shù) 4 4 本章小結(jié) 本章詳細(xì)介紹了主機(jī)端 上位機(jī) 應(yīng)用程序設(shè)計(jì) 詳細(xì)分析了打開(kāi)設(shè)備功能模塊 設(shè)備枚舉的流程 鍵盤(pán)功能模塊與 LCD 功能模塊 5 HID 設(shè)備軟硬件設(shè)計(jì)與實(shí)現(xiàn) 5 1 HID 設(shè)備系統(tǒng)設(shè)計(jì) 本項(xiàng)目的人機(jī)接口設(shè)備端需要硬件設(shè)計(jì)與軟件設(shè)計(jì) 硬件方面包括芯片選擇 電路 圖的設(shè)計(jì)等 軟件方面 即固件代碼 包括 USB 協(xié)議棧的編寫(xiě) 鍵盤(pán)驅(qū)動(dòng)及 LCD 驅(qū)動(dòng)的 編寫(xiě) 這些都是項(xiàng)目開(kāi)發(fā)的重點(diǎn)與難點(diǎn) USB 設(shè)備端的軟件開(kāi)發(fā)實(shí)際上包含著很大的工作量 因?yàn)殚_(kāi)發(fā)者需要在自己的平臺(tái)上 實(shí)現(xiàn)一個(gè) USB 設(shè)備端的協(xié)議棧 簡(jiǎn)單說(shuō)來(lái) USB 設(shè)備端的軟件主要需要兩個(gè)功能 一是 監(jiān)視設(shè)備的狀態(tài) 控制設(shè)備的行為 自動(dòng)產(chǎn)生狀態(tài)信息和用戶(hù)命令信息 二是完成主機(jī) 與設(shè)備之間的 USB 總線通訊 自動(dòng)處理主機(jī)的控制和查詢(xún)命令 實(shí)現(xiàn)前一個(gè)功能的軟件 模塊我們稱(chēng)為 USB 設(shè)備的通用模塊 而實(shí)現(xiàn)后一個(gè)功能的軟件模塊我們稱(chēng)為 USB 設(shè)備的 協(xié)議模塊 5 2 HID 功能模塊設(shè)計(jì)與實(shí)現(xiàn) 5 2 1 USB HID 驅(qū)動(dòng)開(kāi)發(fā) 1 固件流程圖 USB 設(shè)備作為一個(gè)完整的硬件設(shè)備 由硬件和固件兩部分組成 其中 固件包括有關(guān) 系統(tǒng)配置和 CPU 的一些設(shè)置模塊 USB 協(xié)議棧模塊等部分 圖 5 1 為本項(xiàng)目中 USB 設(shè)備固 件流程圖 開(kāi)開(kāi)始始 設(shè)設(shè)備備復(fù)復(fù)位位 系系統(tǒng)統(tǒng)初初始始化化 發(fā)發(fā)送送USB中中斷斷 是是否否是是EP0中中斷斷 是是否否有有數(shù)數(shù)據(jù)據(jù)發(fā)發(fā)送送 數(shù)數(shù)據(jù)據(jù)存存入入緩緩沖沖區(qū)區(qū)等等待待US B中中斷斷 是是否否有有 其其它它USB中中斷斷 清清系系統(tǒng)統(tǒng)變變量量 USB線線是是否否連連接接 結(jié)結(jié)束束 EP0中中斷斷服服務(wù)務(wù)程程序序 Y N Y Y N N Y N N Y 圖 5 1 USB 固件流程圖 2 HID 屬性描述符 如 2 2 4 所述 HID 類(lèi)支持標(biāo)準(zhǔn)的 USB 描述符 即設(shè)備描述符 配置描述符 接口描 述符 端點(diǎn)描述符和字符串描述符 此外 作為一個(gè)特定的設(shè)備類(lèi) HID 有其獨(dú)有的類(lèi)描 述符 即 HID 描述符 報(bào)告描述符和物理描述符 下面主要介紹本項(xiàng)目使用的 HID 描述符 端點(diǎn)描述符與報(bào)告描述符 HID 描述符跟接口描述符 端點(diǎn)描述符類(lèi)似 也是隨配置信息一起返回給主機(jī)的 主 機(jī)并不會(huì)單獨(dú)發(fā)出請(qǐng)求來(lái)讀取它 HID 描述符在配置信息中的位置是緊接接口描述符 HID 描述符詳細(xì)設(shè)計(jì)如下 HID CLASS DESCRIPTOR DB 09H bLength 域 HID 描述符的長(zhǎng)度為 9 個(gè)字節(jié) DB 21H bDescriptorType 域 描述符種類(lèi)為 HID 類(lèi)描述符 DB 00H bcdHID 域 HID 規(guī)范版本號(hào)為 0 x0100 DB 01H DB 00H bCountryCode 域 不支持硬件的目的國(guó)家識(shí)別碼 DB 01H bNumDescriptors 域 支持的附屬描述符數(shù)為 1 即報(bào)告描述符 DB 22H bDescriptorType 域 HID 相關(guān)描述符為 0 x22 即報(bào)表描述符 DB 30H bDescriptorLength 域 報(bào)告描述符的總長(zhǎng)度 0 x0030 即 48 字節(jié) DB 00H 端點(diǎn)描述符詳細(xì)設(shè)計(jì)如下 ENDPOINT DESCRIPTOR INTERRUPT IN DB 07H bLength 域 端點(diǎn)描述符長(zhǎng)度為 7 個(gè)字節(jié) DB 05H bDescriptorType 域 描述符種類(lèi)為端點(diǎn)描述符 DB 83H bEndpointAddress 端點(diǎn)號(hào)為 3 DB 03H bmAttributes 域 端點(diǎn)號(hào)為 3 的端點(diǎn)是 Interrupt In 端點(diǎn) DB 08H wMaxPacketSize 域 0 x0008 DB 00H DB 10H bInterval 域 輪詢(xún)間隔為 2 ms 報(bào)告描述符 顧名思義就是描述 報(bào)告 格式的 這個(gè)格式使主機(jī)和設(shè)備能遵循著 同一個(gè)規(guī)則來(lái)解釋一個(gè)報(bào)告中所含有的數(shù)據(jù) 報(bào)告 是主機(jī)和 HID 設(shè)備之間進(jìn)行數(shù)據(jù)交 換的最小單位 也就是說(shuō) 在主機(jī)完成對(duì)設(shè)備的識(shí)別之后 在具體應(yīng)用上的數(shù)據(jù)交換就 得以 報(bào)告 的方式進(jìn)行 報(bào)告 的類(lèi)型有三種 輸入報(bào)告 輸出報(bào)告和特征報(bào)告 輸 入報(bào)告就是設(shè)備發(fā)給主機(jī)的報(bào)告 而輸出報(bào)告就是主機(jī)發(fā)給設(shè)備的報(bào)告 特征報(bào)告是主 機(jī)發(fā)給設(shè)備的報(bào)告 特征報(bào)告常在自定義 HID 設(shè)備中被用作主機(jī)向設(shè)備發(fā)送自定義數(shù)據(jù) 通過(guò)報(bào)告 USB HOST 可以分析出報(bào)告中數(shù)據(jù)所表示的含義 并通過(guò)控制輸入端點(diǎn) 0 返回 另外 主機(jī)使用獲取報(bào)告描述符命令來(lái)獲取報(bào)告描述符 注意 該請(qǐng)求是發(fā)送到接口 而不是發(fā)送到設(shè)備 一個(gè)報(bào)告描述符可以描述多個(gè)報(bào)告 不同的報(bào)告通過(guò)報(bào)告 ID 來(lái)識(shí)別 報(bào)告 ID 在報(bào)告最前面 即第一個(gè)字節(jié) 當(dāng)報(bào)告描述符中沒(méi)有規(guī)定報(bào)告 ID 時(shí) 報(bào)告中就 沒(méi)有 ID 字段 而直接以數(shù)據(jù)開(kāi)始 與 HID 描述符不同 主機(jī)會(huì)發(fā)出單獨(dú)的請(qǐng)求來(lái)讀取報(bào)告描述符 關(guān)于報(bào)告描述符的 組成 HID 設(shè)備類(lèi)定義文檔中明確指出 一個(gè)報(bào)告描述符必須包含但不僅限于以下數(shù)據(jù)項(xiàng) 輸入 輸出或特征 指明了報(bào)告的類(lèi)型 用法 用法頁(yè) 用法和用法頁(yè)一起指明了數(shù)據(jù) 項(xiàng)的用法 邏輯最小值 邏輯最大值 邏輯最小值和邏輯最大值指明了報(bào)告所使用的數(shù) 據(jù)值的范圍 報(bào)告大小 指明數(shù)據(jù)項(xiàng)的位數(shù) 報(bào)告計(jì)數(shù) 指明有多少個(gè)這樣的數(shù)據(jù)項(xiàng) 報(bào)告描述符詳細(xì)設(shè)計(jì)如下 HID REPORT DESCRIPTOR DB 06H 用法頁(yè) 0 xFFA006 自定義 修飾其下所有主項(xiàng) DB A0H DB FFH DB 09H 用法 0 x0109 局部項(xiàng) 只修飾下面集合主項(xiàng) DB 01H DB A1H 應(yīng)用集合開(kāi)始 01A1 DB 01H DB 09H 用法 0 x0209 DB 02H DB A1H 物理集合開(kāi)始 0 x00A1 DB 00H DB 06H 用法頁(yè) 0 xFFA106 DB A1H DB FFH DB 09H 用法 0 x0309 DB 03H DB 15H 邏輯最小值 127 DB 80H DB 25H 邏輯最大值 128 DB 7FH DB 35H 物理最小值 00 DB 00H DB 45H 物理最大值 255 DB FFH DB 75H 報(bào)告大小 8 bits DB 08H DB 95H 報(bào)告計(jì)數(shù) 8 DB 08H DB 81H 輸入 數(shù)據(jù) 變量 絕對(duì)值 DB 02H DB 09H 用法 0 x0409 DB 04H DB 15H 邏輯最小值 127 DB 80H DB 25H 邏輯最大值 128 DB 7FH DB 35H 物理最小值 00 DB 00H DB 45H 物理最大值 255 DB FFH DB 75H 報(bào)告大小 8 bits DB 08H DB 95H 報(bào)告計(jì)數(shù) 32 DB 20H DB B1H 特征 數(shù)據(jù) 變量 絕對(duì)值 DB 02H DB C0H 物理集合結(jié)束 DB C0H 應(yīng)用集合結(jié)束 5 2 2 LCD 驅(qū)動(dòng)開(kāi)發(fā) 本項(xiàng)目采用 ST7070 點(diǎn)陣液晶顯示控制器來(lái)驅(qū)動(dòng)字符顯示 ST7070 控制器集成了顯示 RAM 字符發(fā)生器 液晶驅(qū)動(dòng)模塊 MCU 只需利用 3 線 SPI 跟 ST7070 通信 通過(guò)寫(xiě)入一些 控制命令給 ST7070 來(lái)控制 ST7070 驅(qū)動(dòng)液晶屏達(dá)到顯示字符等的目的 圖 5 2 顯示了 LCD 驅(qū)動(dòng)器的原理框圖 主主微微控控制制器器 ST2211U LCD驅(qū)驅(qū)動(dòng)動(dòng)器器 ST7070 LCD 液液晶晶顯顯示示屏屏 主主微微控控制制器器 ST2211U LCD驅(qū)驅(qū)動(dòng)動(dòng)器器 ST7070 LCD 液液晶晶顯顯示示屏屏 圖 5 2 LCD 驅(qū)動(dòng)器原理框圖 ST7070 點(diǎn)陣式液晶顯示控制器及 LSI 驅(qū)動(dòng)器提供包括顯示字母數(shù)字 片假名及符號(hào) 的功能 在 4 8 位微處理器控制下 可以對(duì) ST7070 進(jìn)行配置 以驅(qū)動(dòng)處理點(diǎn)陣式液晶顯 示器 外接的微處理器可以通過(guò)高速串行接口 如 3 線 SPI 或 4 線 SPI 直接控制 ST7070 由于驅(qū)動(dòng)一個(gè)點(diǎn)陣液晶顯示器所需要的功能 例如 顯示 RAM 字符發(fā)生器和液 晶驅(qū)動(dòng) 都是由內(nèi)部芯片提供的 故此控制器兼容了最小的系統(tǒng) ST7070 部分兼容了 HD44780 KS0066 和 SED1278 的功能 因此允許用戶(hù)使用 ST7070 來(lái)代替它們 ST7070 字 符發(fā)生存儲(chǔ)器可擴(kuò)展至生產(chǎn)共達(dá) 496 個(gè)不同的 5 8 點(diǎn)陣式字型 ST7070 提供了 2 7V 5 5V 的電源供應(yīng) 適合低使用便攜式電池驅(qū)動(dòng)的低功耗產(chǎn)品 ST7070 的 LCD 驅(qū)動(dòng) 器組成的 16 個(gè)通用信號(hào)驅(qū)動(dòng)器和 80 段信號(hào)驅(qū)動(dòng)器 可以通過(guò)級(jí)聯(lián)段驅(qū)動(dòng)器 ST7921 擴(kuò)展 其尺寸 最大的顯示尺寸可以是一行 80 個(gè)字符或兩行 40 個(gè)字符 單個(gè) ST7070 可以顯示 最大可顯示一行 16 個(gè)字符或兩行 16 個(gè)字符 LCD 驅(qū)動(dòng)器初始化流程 如圖 5 3 所示 Power On Delay 41ms After Vcc 4 5V Function set Delay 38us Display ON OFF control Delay 37us Display clear Delay 1 53ms Entry mode set Initialization end 圖 5 3 LCD 驅(qū)動(dòng)器初始化流程圖 5 2 3 鍵盤(pán)驅(qū)動(dòng)開(kāi)發(fā) 本項(xiàng)目采用 4 5 矩陣鍵盤(pán) 在鍵盤(pán)中按鍵數(shù)量較多時(shí) 為了減少 I O 口的占用 通 常將按鍵排列成矩陣形式 如圖 5 4 所示 在矩陣式鍵盤(pán)中 每條水平線和垂直線在交 叉處不直接連通 而是通過(guò)一個(gè)按鍵加以連接 鍵盤(pán)是由一組規(guī)則排列的按鍵組成 一 個(gè)按鍵實(shí)際上是一個(gè)開(kāi)關(guān)元件 按鍵按下時(shí) 與此鍵相連的行線與列線導(dǎo)通 行線在無(wú) 鍵按下時(shí)處在高電平 顯然 如果讓所有的列線也處在高電平 那么 按鍵按下與否不 會(huì)引起行線電平的變化 因此 必須使所有列線處在低電平 只有這樣 當(dāng)有鍵按下時(shí) 該鍵所在的行電平才會(huì)由高電平變?yōu)榈碗娖?CPU 根據(jù)行電平的變化 便能判定相應(yīng)的 行是否有鍵按下 圖 5 4 4 5 矩陣鍵盤(pán)電路圖 行列掃描法又稱(chēng)為逐行 或列 掃描查詢(xún)法 是一種最常用的按鍵識(shí)別方法 項(xiàng)目 中 ST2211U 微控制器的 GPIO 口提供的 I O 端口分為四組 Port A B C D 將行線所接 的 PB 7 4 口作為輸出端 列線所接的 PA 4 0 口作為輸入端 識(shí)別方法 首先 判斷 鍵盤(pán)中有無(wú)鍵按下 將全部行線 PB 7 4 置為低電平 然后逐一檢測(cè)列線的電平狀態(tài) 只要有一列的電平為低 則表示鍵盤(pán)中有鍵被按下 而且閉合的鍵位于低電平線與 4 根 行線相交叉的 4 個(gè)按鍵之中 若所有列線均為高電平 則鍵盤(pán)中無(wú)鍵按下 若確認(rèn)有鍵 按下 則要判斷閉合鍵所在的位置 依次將行線置為低電平 即在置某根行線為低電平 時(shí) 其它線為高電平 在確定某根行線置為低電平后 再逐行檢測(cè)各列線的電平狀態(tài) 若某列為低電平 則該列線與置為低電平的行線交叉處的按鍵就是閉合的按鍵 圖 5 5 為本項(xiàng)目的鍵盤(pán)驅(qū)動(dòng)流程圖 開(kāi)開(kāi)始始 行行X置置為為低低電電平平 并并 開(kāi)開(kāi)始始掃掃描描各各列列Y 是是否否有有鍵鍵按按下下 列列Y是是否否為為高高電電平平 列列值值Y增增一一 列列值值為為6 行行值值X增增一一 行行值值為為5 鍵鍵值值為為0 結(jié)結(jié)束束 Y Y Y 記記錄錄鍵鍵值值 N N N N 圖 5 5 鍵盤(pán)驅(qū)動(dòng)流程圖 5 3 本章小結(jié) 本章詳細(xì)描述了設(shè)備端的各個(gè)模塊驅(qū)動(dòng)開(kāi)發(fā) USB HID 驅(qū)動(dòng)開(kāi)發(fā) LCD 驅(qū)動(dòng)開(kāi)發(fā)及鍵 盤(pán)驅(qū)動(dòng)開(kāi)發(fā) 6 整機(jī)系統(tǒng)調(diào)試 6 1 調(diào)試流程 正確 合理的調(diào)試方法是成功開(kāi)發(fā)一個(gè) USB 人機(jī)接口設(shè)備必不可少的環(huán)節(jié) 本項(xiàng)目 的調(diào)試過(guò)程分三步進(jìn)行 首先 對(duì)于人機(jī)接口設(shè)備 借助 PC 調(diào)試軟件 Bus House 將設(shè) 備端的 USB 協(xié)議 數(shù)據(jù)交換等調(diào)通 然后 使用調(diào)試好的人機(jī)接口設(shè)備接口開(kāi)發(fā)上位機(jī) 上的應(yīng)用程序 最后 進(jìn)行整機(jī)測(cè)試 6 2 Bus Hound 調(diào)試工具簡(jiǎn)介 Bus Hound 軟件是由美國(guó) perisoft 公司研制的一種專(zhuān)用于 PC 機(jī)各種總線 數(shù)據(jù)包監(jiān) 視和控制的開(kāi)發(fā)工具軟件 其名 hound 的中文意思為 獵犬 即指其能敏銳地感知到總線 的絲毫變化 Bus Hound 是一個(gè)超級(jí)軟件總線協(xié)議分析器 用于捕捉來(lái)自設(shè)備的協(xié)議包和輸入輸出 操作 其優(yōu)良特性如下 支持所有版本的 IDE SCSI USB 1394 總線 支持各類(lèi)設(shè)備如硬盤(pán) 庫(kù) DVD 鼠標(biāo) 掃描儀 網(wǎng)絡(luò)照相機(jī)等 支持 Windows9X WindowsMe NT4 0 2000 2003 XP 和嵌入式 XP 操作系統(tǒng) 捕捉數(shù)據(jù)的總量?jī)H受機(jī)器內(nèi)存限制 可以設(shè)置觸發(fā)信號(hào)自動(dòng)停止 捕獲操作 測(cè)試讀取 同步等設(shè)備性能 捕獲設(shè)備驅(qū)動(dòng)包 例如 IRP 捕獲任意數(shù)量的并行 設(shè)備 而不管其總線類(lèi)型 易于交換與下載 捕獲的數(shù)據(jù)易于拷貝到其它環(huán)境生成 Html 格式 捕獲的數(shù)據(jù)能保存為文本文件或 ZIP 文件 所有的可捕獲設(shè)備以樹(shù)形結(jié)構(gòu)列出 讓 選擇設(shè)備來(lái)得更輕松些 可捕獲設(shè)備的啟動(dòng)過(guò)程 用戶(hù)愛(ài)好設(shè)定功能 如用戶(hù)可調(diào)整捕獲 到的數(shù)據(jù)顯示寬度 更宜于查看和使用 查看底層協(xié)議包括 SCSI 的 sense 數(shù)據(jù)和 USB 的 設(shè)置包 查看每階段的時(shí)間變化精確到微秒 將輸入輸出發(fā)生的操作實(shí)時(shí)顯示到屏幕上 純軟件解決方案 不需要對(duì)硬件進(jìn)行任何變更等等 Bus Hound 是一款可以查看 USB 總線數(shù)據(jù)的調(diào)試軟件 Bus Hound 的調(diào)試步驟如下 打開(kāi) Bus Hound 中的 Devices 頁(yè) 在 Devices 頁(yè)選中本項(xiàng)目的 HID compliant device 再轉(zhuǎn)至 Capture 頁(yè) 點(diǎn)擊 Run 插入 HID 設(shè)備 6 3 HID 設(shè)備接口通信調(diào)試 采用 Bus Hound 捕獲數(shù)據(jù) 枚舉過(guò)程數(shù)據(jù)獲取如下 表 6 1 設(shè)備枚舉數(shù)據(jù)捕獲 傳輸類(lèi)型傳輸數(shù)據(jù)描述 CTL80 06 00 02 00 00 ff 00 獲取配置描述符的 FF 個(gè)字節(jié) 09 02 22 00 01 01 00 80 32 09 04 00 00 01 03 00 00 00 09 21 00 01 00 01 22 30 00 DI 07 05 83 03 08 00 10 CTL80 06 00 01 00 00 12 00 獲取設(shè)備描述符的 18 個(gè)字節(jié) DI12 01 10 01 03 00 00 08 71 04 12 a1 01 00 01 02 00 01 設(shè)備描述符 CTL80 06 00 02 00 00 09 00 獲取配置描述符的 9 個(gè)字節(jié) DI09 02 22 00 01 01 00 80 32 配置描述符 CTL80 06 00 02 00 00 22 00 獲取設(shè)備描述符的 34 個(gè)字節(jié) 09 02 22 00 01 01 00 80 32 配置描述符 09 04 00 00 01 03 00 00 00 接口描述符 09 21 00 01 00 01 22 30 00 HID 描述符 DI 07 05 83 03 08 00 01 端點(diǎn)描述符 其中 CTL 表示 控制傳輸 DI 表示數(shù)據(jù)輸入 可根據(jù) Bus House 捕獲到的信息判 斷 HID 設(shè)備是否被正確的配置 識(shí)別 同此法 亦可獲取數(shù)據(jù)交互的具體數(shù)據(jù) 6 4 基于 VC 的應(yīng)用軟件調(diào)試 VC 的調(diào)試方法 首先必須使程序中包含調(diào)試信息 為了增加調(diào)試信息 可以按照下 述步驟進(jìn)行 打開(kāi) Project settings 對(duì)話框 可以通過(guò)快捷鍵 ALT F7 打開(kāi) 也可以通 過(guò) IDE 菜單 Project Settings 打開(kāi) 選擇 C C 頁(yè) Category 中選擇 general 則出 現(xiàn)一個(gè) Debug Info 下拉列表框 可供選擇的調(diào)試信息方式如表 6 2 所示 本項(xiàng)目采用 Program Database for Edit and Continue 的方式 表 6 2 VC 調(diào)試信息方式 命令行 Project settings 說(shuō)明 無(wú) None 沒(méi)有調(diào)試信息 ZdLine Numbers Only 目標(biāo)文件或者可執(zhí)行文件中只包含全 局和導(dǎo)出符號(hào)以及代碼行信息 不包 含符號(hào)調(diào)試信息 Z7C 7 0 Compatible 目標(biāo)文件或者可執(zhí)行文件中包含行號(hào) 和所有符號(hào)調(diào)試信息 包括變量名及 類(lèi)型 函數(shù)及原型等 ZiProgram Database 創(chuàng)建一個(gè)程序庫(kù) PDB 包括類(lèi)型信息 和符號(hào)調(diào)試信息 ZIProgram Database for Edit and Continue 除了前面 Zi 的功能外 這個(gè)選項(xiàng)允許 對(duì)代碼進(jìn)行調(diào)試過(guò)程中的修改和繼續(xù) 執(zhí)行 再選擇 Link 頁(yè) 選中復(fù)選框 Generate Debug Info 這個(gè)選項(xiàng)將使連接器把調(diào)試 信息寫(xiě)進(jìn)可執(zhí)行文件和 DLL 如圖 6 1 所示 本項(xiàng)目須添加 hid lib setupapi lib 如果 C C 頁(yè)中設(shè)置了 Program Database 以上的選項(xiàng) 則 Link incrementally 可以選擇 選 中這個(gè)選項(xiàng) 將使程序可以在上一次編譯的基礎(chǔ)上被編譯 即增量編譯 而不必每次都 從頭開(kāi)始編譯 圖 6 1 VC 調(diào)試信息設(shè)置 6 5 測(cè)試結(jié)果 打開(kāi)人機(jī)接口設(shè)備演示程序 1 打開(kāi)設(shè)備功能測(cè)試 點(diǎn)擊打開(kāi)設(shè)備按鈕 會(huì)出現(xiàn)如圖 6 2 所示的提示信息 具體的枚舉過(guò)程見(jiàn) 2 2 3 USB 總線枚舉過(guò)程 及表 6 1 枚舉數(shù)據(jù)的捕獲 圖 6 2 打開(kāi)設(shè)備功能測(cè)試 2 LCD 顯示功能測(cè)試 在輸入框輸入欲顯示在 LCD 上的字符 再點(diǎn)擊 LCD 顯示按鈕 如圖 6 3 所示 設(shè)備 上的 LCD 液晶顯示屏即會(huì)顯示輸入的字符 圖 6 3 LCD 顯示功能測(cè)試 具體 LCD 傳輸數(shù)據(jù)用 Bus Hound 捕獲如表 6 3 其中 CTL 為控制傳輸 D0 為數(shù)據(jù)輸 出 D0 輸出的第一個(gè)字節(jié) 01 為 LCD 顯示命令 后面為 31 個(gè)字節(jié)為欲顯示的字節(jié) 表 6 3 LCD 傳輸數(shù)據(jù)捕獲 傳輸類(lèi)型傳輸數(shù)據(jù)描述 CTL21 09 00 03 00 00 20 00SET REPORT DO01 0e 48 65 6c 6c 6f 20 44 61 76 69 64 21 21 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3 鍵盤(pán)功能測(cè)試 點(diǎn)擊鍵盤(pán)輸入功能 即可在開(kāi)發(fā)板實(shí)現(xiàn)按鍵功能 并回傳至人機(jī)接口設(shè)備 如下圖 6 3 所示 顯示框成功輸出 33 32 31 30 37 36 圖 6 4 鍵盤(pán)功能測(cè)試 具體鍵盤(pán)傳輸數(shù)據(jù)用 Bus Hound 捕獲如表 6 4 其中 CTL 為控制傳輸 D0 為數(shù)據(jù)輸 出 DI 為數(shù)據(jù)輸入 D0 輸出的第一個(gè)字節(jié) 02 為鍵盤(pán)命令 DI 為設(shè)備傳回的鍵值 表 6 4 鍵盤(pán)傳輸數(shù)據(jù)捕獲 傳輸類(lèi)型傳輸數(shù)據(jù)描述 CTL21 09 00 03 00 00 20 00SET REPORT DO02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DI06 31 30 31 32 33 34 35 DI00 06 31 30 31 32 33 34 35 7 總結(jié)與展望 在本項(xiàng)目的開(kāi)發(fā)過(guò)程中 本人深深的感悟到開(kāi)發(fā)一個(gè) USB HID 設(shè)備看起來(lái)容易 實(shí) 則艱難 選擇 HID 設(shè)備類(lèi) 雖然省略了主機(jī)端驅(qū)動(dòng)程序的開(kāi)發(fā) 但是設(shè)備端定義為一個(gè) 全速 HID 設(shè)備 需要深入了解 USB 2 0 協(xié)議 深入了解 HID 描述符的內(nèi)涵 項(xiàng)目中的許 多地方 比如鍵盤(pán)與 LCD 的同步處理 線程的響應(yīng)也做得并不完善 還有待提高 雖然 項(xiàng)目是結(jié)束了 但是感覺(jué)對(duì) USB 協(xié)議的理解仍是九牛一毛 是遠(yuǎn)遠(yuǎn)不夠的 在后續(xù)的工 作中 還要加強(qiáng)學(xué)習(xí) 2008 年 11 月 16 日 隨著 USB3 0 規(guī)范的發(fā)布 新一輪的接口技術(shù)將引領(lǐng) IT 業(yè)接口 技術(shù)的發(fā)展 USB 接口技術(shù)脫胎換骨 USB3 0 支持高達(dá) 5 0Gbps 的傳輸速率 并且保持 了良好的向下兼容 十倍于 USB2 0 的傳輸速率和更高的節(jié)能效率 標(biāo)志著 USB 向高速外 設(shè)進(jìn)軍的又一里程碑 USB3 0 毫無(wú)懸念的將帶動(dòng) USB 接口技術(shù)走向更美好的明天 參考文獻(xiàn) 1 王云飛 USB 系統(tǒng)研究 M 清華大學(xué)工程物理系 2001 5 2 李英偉 王成儒 胡正平 USB 2 0 原理與工程開(kāi)發(fā) 國(guó)防工業(yè)出版社 2006 3 武安河 周利莉 Windows 設(shè)備驅(qū)動(dòng)程序 VxD 與 WDM 開(kāi)發(fā)實(shí)務(wù) M 電子工業(yè)出 版社 2001 4 范文慶 周彬彬 安靖 精通 Windows API 函數(shù) 接口 編程實(shí)例 M 人民郵電 出版社 2009 5 周立功 等 PDIUSBD12 USB 固件編程與驅(qū)動(dòng)程序 M 北京航空航天大學(xué)出版社 2003 6 馬斌 單片機(jī)原理及應(yīng)用 M 人民郵電出版社 2009 7 李建忠 單片機(jī)原理及應(yīng)用 M 西安電子科技大學(xué)出版社 2002 8 珧建剛 魏安陽(yáng) 邱淑范 通用串行總線 USB 設(shè)備的驅(qū)動(dòng) J 電子技術(shù)應(yīng)用 2001 年第 5 期 第 14 16 頁(yè) 9 詹客團(tuán) 侯國(guó)志 呂鐵良等 USB HID 類(lèi)設(shè)備開(kāi)發(fā) J 電測(cè)與儀表 2004 年 第 5 期 第 48 50 頁(yè) 10 Walter Oney Programming the Microsoft Windows Driver Model Microsoft press 2000 11 Compaq Intel Philips Universal Serial Bus Specification Revision2 0 http www usb org 2000 12 Compaq Intel Philips Device Class Definition for Human Interface Devices HID http www usb org 2001 13 ST2211 Integrated Microcontroller User s Manual 2006 14 HID Usage Tables Version 1 11 2001 15 ST7070 Dot Matrix LCD Controller Driver 2008 附 錄 附錄一 上位機(jī)打開(kāi)設(shè)備代碼 void CHidSchoolDlg OnOpenDev 定義一個(gè) GUID 的結(jié)構(gòu)體 HidGuid 來(lái)保存 HID 設(shè)備的接口類(lèi) GUID GUID HidGuid 定義一個(gè) DEVINFO 的句柄 hDevInfoSet 來(lái)保存獲取到的設(shè)備信息集合句柄 HDEVINFO hDevInfoSet 定義 MemberIndex 表示當(dāng)前搜索到第幾個(gè)設(shè)備 0 表示第一個(gè)設(shè)備 DWORD MemberIndex DevInterfaceData 用來(lái)保存設(shè)備的驅(qū)動(dòng)接口信息 SP DEVICE INTERFACE DATA DevInterfaceData 定義一個(gè) BOOL 變量 保存函數(shù)調(diào)用是否返回成功 BOOL Result 定義一個(gè) RequiredSize 的變量 用來(lái)接收需要保存詳細(xì)信息的緩沖長(zhǎng)度 DWORD RequiredSize 定義一個(gè)指向設(shè)備詳細(xì)信息的結(jié)構(gòu)體指針 PSP DEVICE INTERFACE DETAIL DATApDevDetailData 定義一個(gè)用來(lái)保存打開(kāi)設(shè)備的句柄 HANDLE hDevHandle 定義一個(gè) HIDD ATTRIBUTES 的結(jié)構(gòu)體變量 保存設(shè)備的屬性 HIDD ATTRIBUTES DevAttributes 初始化設(shè)備未找到 MyDevFound FALSE 對(duì) DevInterfaceData 結(jié)構(gòu)體的 cbSize 初始化為結(jié)構(gòu)體大小 DevInterfaceData cbSize sizeof DevInterfaceData 對(duì) DevAttributes 結(jié)構(gòu)體的 Size 初始化為結(jié)構(gòu)體大小 DevAttributes Size sizeof DevAttributes 調(diào)用 HidD GetHidGuid 函數(shù)獲取 HID 設(shè)備的 GUID 并保存在 HidGuid 中 HidD GetHidGuid 根據(jù) HidGuid 來(lái)獲取設(shè)備信息集合 其中 Flags 參數(shù)設(shè)置為 DIGCF DEVICEINTERFACE DIGCF PRESENT 前者表示使用的 GUID 為 接口類(lèi) GUID 后者表示只列舉正在使用的設(shè)備 因?yàn)槲覀冞@里只 查找已經(jīng)連接上的設(shè)備 返回的句柄保存在 hDevinfo 中 注意設(shè)備 信息集合在使用完畢后 要使用函數(shù) SetupDiDestroyDeviceInfoList 銷(xiāo)毀 不然會(huì)造成內(nèi)存泄漏 hDevInfoSet SetupDiGetClassDevs AddToInfOut 開(kāi)始查找設(shè)備 然后對(duì)設(shè)備集合中每個(gè)設(shè)備進(jìn)行列舉 檢查是否是我們要找的設(shè)備 當(dāng)找到我們指定的設(shè)備 或者設(shè)備已經(jīng)查找完畢時(shí) 就退出查找 首先指向第一個(gè)設(shè)備 即將 MemberIndex 置為 0 MemberIndex 0 while 1 調(diào)用 SetupDiEnumDeviceInterfaces 在設(shè)備信息集合中獲取編號(hào)為 MemberIndex 的設(shè)備信息 Result SetupDiEnumDeviceInterfaces hDevInfoSet NULL 如果獲取信息失敗 則說(shuō)明設(shè)備已經(jīng)查找完畢 退出循環(huán) if Result FALSE break 將 MemberIndex 指向下一個(gè)設(shè)備 MemberIndex 如果獲取信息成功 則繼續(xù)獲取該設(shè)備的詳細(xì)信息 在獲取設(shè)備 詳細(xì)信息時(shí) 需要先知道保存詳細(xì)信息需要多大的緩沖區(qū) 這通過(guò) 第一次調(diào)用函數(shù) SetupDiGetDeviceInterfaceDetail 來(lái)獲取 這時(shí) 提供緩沖區(qū)和長(zhǎng)度都為 NULL 的參數(shù) 并提供一個(gè)用來(lái)保存需要多大 緩沖區(qū)的變量 RequiredSize Result SetupDiGetDeviceInterfaceDetail hDevInfoSet 然后 分配一個(gè)大小為 RequiredSize 緩沖區(qū) 用來(lái)保存設(shè)備詳細(xì)信息 pDevDetailData PSP DEVICE INTERFACE DETAIL DATA malloc RequiredSize if pDevDetailData NULL 如果內(nèi)存不足 則直接返回 MessageBox 內(nèi)存不足 SetupDiDestroyDeviceInfoList hDevInfoSet return 并設(shè)置 pDevDetailData 的 cbSize 為結(jié)構(gòu)體的大小 注意只是結(jié)構(gòu)體大小 不包括后面緩沖區(qū) pDevDetailData cbSize sizeof SP DEVICE INTERFACE DETAIL DATA 然后再次調(diào)用 SetupDiGetDeviceInterfaceDetail 函數(shù)來(lái)獲取設(shè)備的 詳細(xì)信息 這次調(diào)用設(shè)置使用的緩沖區(qū)以及緩沖區(qū)大小 Result Set
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度餐飲企業(yè)數(shù)字化轉(zhuǎn)型股東合作協(xié)議
- 二零二五年度酒店客房預(yù)訂與商務(wù)洽談與住宿套餐合同
- 二零二五年度婚姻介紹所涉外婚姻服務(wù)合同
- 二零二五餐飲業(yè)商鋪?zhàn)赓U合同附贈(zèng)會(huì)員管理系統(tǒng)合作
- 2025年宜賓貨運(yùn)從業(yè)資格考題
- 《物流系統(tǒng)分析》課件 項(xiàng)目七任務(wù)一 認(rèn)識(shí)物流系統(tǒng)控制
- 村支部書(shū)記發(fā)言稿
- 殘聯(lián)疫情發(fā)言稿
- 高中家長(zhǎng)會(huì):高二下學(xué)期期末家長(zhǎng)會(huì)課件
- 吉安市房屋租賃合同
- 內(nèi)分泌科護(hù)理常規(guī)的課件
- 氣管切開(kāi)患者的管理和康復(fù)治療推薦意見(jiàn)(新版)解讀
- 疼痛科營(yíng)銷(xiāo)方案
- 中醫(yī)藥在關(guān)節(jié)病變治療中的價(jià)值
- 《香水知識(shí)》課件
- 公務(wù)員獎(jiǎng)勵(lì)審批表(表格)
- 醫(yī)院污水處理站維保服務(wù)項(xiàng)目
- 裝修項(xiàng)目經(jīng)理的簡(jiǎn)歷樣板
- 供應(yīng)商績(jī)效考核表 (季度)
- Python程序設(shè)計(jì)基礎(chǔ)及實(shí)踐(慕課版)PPT完整全套教學(xué)課件
- 《爭(zhēng)做新時(shí)代好少年》主題班會(huì)課件(美德好少年)
評(píng)論
0/150
提交評(píng)論