<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 電源與新能源 > 設計應用 > 基于Wave Panel 的HID 設備通訊接口設計

          基于Wave Panel 的HID 設備通訊接口設計

          作者: 時間:2013-07-10 來源:網(wǎng)絡 收藏

          0 引 言

          本文引用地址:http://www.ex-cimer.com/article/174978.htm

          HID(Human Interface Device,人機接口設備)是一類低速USB 設備,典型的HID 設備有鍵盤.鼠標.游戲桿等.相對于U 盤.打印機等高速USB 設備,HID 設備具有使用方便.響應迅速.研發(fā)成本低廉等優(yōu)點,其應用領域十分廣泛.當前HID 設備正在向?qū)S没较蚩焖侔l(fā)展 .

          Wave Panel 是蘋果公司研發(fā)的色彩編輯軟件Color 支持一型專用的數(shù)據(jù)輸入和顯示HID 設備,該設備面板上設置有按鍵.解碼器和二維跟蹤球三種,能夠快捷.精確地對各類色彩參數(shù)進行設置,并將控制和狀態(tài)信息同步顯示在設備微型顯示屏上,從而改變了傳統(tǒng)“鼠標+鍵盤”的編輯軟件控制方式.Wave Panel 沒有提供Windows 環(huán)境下與應用程序通訊的功能,因此可基于Wave Panel 設計一個功能完備.通用性強的通訊接口,并加以驗證.這對企業(yè)和科研機構根據(jù)實際需求靈活地配備和控制專用HID 設備有很大幫助.

          1 Wave Panel 的性能特征

          HID 設備除滿足USB 標準外,還具備一些與人機交互密切相關的特點,主要包括:

          1)通常使用控制方式或中斷方式通訊.兩種傳輸方式的區(qū)別在于控制方式適用于對延遲沒有特別限制的數(shù)據(jù),而中斷方式適用于低延遲.周期性的數(shù)據(jù) .Wave Panel 的數(shù)據(jù)傳輸方式為中斷方式.

          2)單次傳輸?shù)臄?shù)據(jù)量小,且這些數(shù)據(jù)以狀態(tài)變化信息或控制信息為主.其中低速HID 設備單次傳輸數(shù)據(jù)最大為8 字節(jié),全速設備為64 字節(jié),高速設備為1024 字節(jié).主機與HID 設備交換的數(shù)據(jù)存儲在報表(Report)結構內(nèi) .

          Wave Panel 的輸入報表長度為27 字節(jié),其中0 字節(jié)用于記錄報表ID,1 ~ 6 字節(jié)的前41 比特分別記錄41 個按鍵的按下或抬起狀態(tài),另有7 比特未用,置為0;7 ~19 字節(jié)分別記錄13 個解碼器的狀態(tài);20 ~25 字節(jié)每2 字節(jié)分別記錄一個二維跟蹤球X 軸和Y 軸的狀態(tài);26 字節(jié)留作固件升級使用.Wave Panel 的輸出報表長度為41 字節(jié),其中0 ~ 5 字節(jié)為控制命令,6 ~ 40字節(jié)為顯示信息的字符.

          3)使用輪詢方式檢測設備狀態(tài)變化情況.HID 設備可能在任何時刻向主機發(fā)送數(shù)據(jù),例如鼠標發(fā)生移動或鍵盤有按鍵按下.所以HID 設備會在一個固定的時間間隔內(nèi)輪詢各控制口一次,當發(fā)現(xiàn)設備狀態(tài)有變化時生成輸入報表發(fā)送給主機 .但輪詢的間隔時間要由用戶對HID 設備的操作速度決定.如果間隔時間過小,則用戶來不及在兩次輪詢間隔內(nèi)完成一次操作;反之,又會使HID 設備的響應速度無法與用戶的操作速度匹配,造成延遲 .

          Wave Panel 規(guī)定,每40 毫秒對所有端口輪詢一次,若其中任何一個的狀態(tài)在兩次輪詢間隔內(nèi)發(fā)生改變,就會在下次輪詢前生成輸入報表發(fā)送給主機.40 毫秒是基于視頻每幀顯示時間而確定的.

          2 HID 設備的通訊過程

          HID 設備是Windows 操作系統(tǒng)最早支持的USB設備.在Windows 98 及以后的各版本中都已內(nèi)置了HID 設備的驅(qū)動程序,主機與HID 設備通訊時無須再編寫專門的驅(qū)動程序.這就簡化了HID 設備與主機應用程序通訊接口的設計和研發(fā).

          通過分析,可以將HID 設備與主機應用程序的通訊劃分為設備識別和打開.讀報表.寫報表和設備關閉四個模塊.

          2. 1 Wave Panel 的識別和打開

          HID 設備連接到主機后,以廠商ID(VID).產(chǎn)品ID(PID)和產(chǎn)品版本號(PVN)三項屬性值的組合作為設備唯一標識.Wave Panel 的三項屬性值可以從產(chǎn)品說明書直接獲取.由于一臺主機可能同時連接有多臺HID 設備,所以在通訊前應用程序必須要識別并打開Wave Panel,這一過程需要調(diào)用多個Windows API函數(shù)實現(xiàn).基本方法是首先獲取當前與主機連接的所有HID 設備信息的集合,然后逐一枚舉集合中的各設備,并比較VID.PID 和PVN 值.當三項屬性值都與Wave Panel 相等時表示已經(jīng)找到,調(diào)用CreateFile()將該Wave Panel 打開,并保存Wave Panel 設備句柄.該模塊的流程如圖1 所示.

          流程中調(diào)用的Windows API 函數(shù)和結構體變量類型分別在hidpi. h.hidsdi. h.hidusage. h.setupapi. h 和hid. lib.setupapi. lib 幾個文件中定義并實現(xiàn) .主要包括:

          1)HidD_GetHidGuid( ):獲取HID 設備的GUID值,并保存在一個GUID 結構體變量中;

          2)SetupDiGetClassDevs():根據(jù)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 設備向主機輸入數(shù)據(jù).當WavePanel 面板上任意控制器狀態(tài)發(fā)生變化時,都會在下一次輪詢時將這些數(shù)據(jù)生成輸入報表,并發(fā)送給主機.

          主機上的應用程序接收輸入報表并對數(shù)據(jù)進行解析,然后做出相應的處理.

          由于Wave Panel 可能在任何時候與主機以中斷方式進行通訊,因此應用程序需要維護一個異步調(diào)用的讀報表線程.該線程在Wave Panel 沒有向主機輸入數(shù)據(jù)時阻塞,以減輕系統(tǒng)負載.當有數(shù)據(jù)輸入時,線程恢復運行,調(diào)用ReadFile()將輸入數(shù)據(jù)保存在緩沖區(qū)中,并對數(shù)據(jù)進行解析.這之后線程將再次被阻塞,直到有新的輸入數(shù)據(jù)到來.應用程序在Wave Panel成功打開后就創(chuàng)建讀報表線程,應用程序運行結束前該線程將一直存在.讀報表流程如圖2 所示.


          上一頁 1 2 下一頁

          關鍵詞: 控制器 視頻

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();