1. 程式人生 > >基於Windows8與Visual Studio11開發第一個USB驅動應用程式

基於Windows8與Visual Studio11開發第一個USB驅動應用程式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

USB ,是英文Universal Serial BUS(通用序列匯流排)的縮寫,而其中文簡稱為“通串線,是一個外部匯流排標準,用於規範電腦與外部裝置的連線和通訊。是應用在PC領域的介面技術。USB介面支援裝置的即插即用和熱插拔功能。USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯合提出的。

 

從1994年11月11日發表了USB V0.7版本以後,USB版本經歷了多年的發展,到現在已經發展為3.0版本,成為目前電腦中的標準擴充套件介面。目前主機板中主要是採用USB1.1和USB2.0,各USB版本間能很好的相容。USB用一個4針(USB3.0標準為9針)插頭作為標準插頭,採用菊花鍊形式可以把所有的外設連線起來,最多可以連線127個外部裝置,並且不會損失頻寬。USB需要主機硬體、作業系統和外設三個方面的支援才能工作。目前的主機板一般都採用支援USB功能的控制晶片組,主機板上也安裝有USB介面插座,而且除了背板的插座之外,主機板上  USB介面
還預留有USB插針,可以通過連線接到機箱前面作為前置USB介面以方便使用(注意,在接線時要仔細閱讀主機板說明書並按圖連線,千萬不可接錯而使裝置損壞)。而且USB介面還可以通過專門的USB連機線實現雙機互連,並可以通過Hub擴展出更多的介面。USB具有傳輸速度快(USB1.1是12Mbps,USB2.0是480Mbps,USB3.0是5 Gbps),使用方便,支援熱插拔,連線靈活,獨立供電等優點,可以連線滑鼠、鍵盤、印表機、掃描器、攝像頭、快閃記憶體盤、MP3機、手機、數碼相機、行動硬碟、外接光軟碟機、USB網絡卡、ADSL Modem、Cable Modem等,幾乎所有的外部裝置。   USB介面可用於連線多達127個外設,如滑鼠、調變解調器和鍵盤等。USB自從1996年推出後,已成功替代串列埠和並口,併成為當今個人電腦和大量智慧裝置的必配的介面之一。   USB各版本區別版本最大傳輸速率速率稱號最大輸出電流協議推出時間:   USB1.0:1.5Mbps(192KB/s)低速(Low-Speed)500mA……1996年1月   USB1.1:12Mbps(1.5MB/s)全速(Full-Speed)500mA……1998年9月   USB2.0:480Mbps(60MB/s)高速(High-Speed)500mA……2000年4月   USB3.0:5Gbps(640MB/s)超速(Super-Speed)900mA……2008年11月
USB的應用
  隨著計算機硬體飛速發展,外圍裝置日益增多,鍵盤、滑鼠、調變解調器、印表機、掃描器早已為人所共知,數碼相機、MP3隨身聽接踵而至,這麼多的裝置,如何接入個人計算機?USB就是基於這個目的產生的。USB是一個使計算機周邊裝置連線標準化、單一化的介面,其規格是由Intel(英特爾)、NEC、Compaq、DEC、IBM(商業機器公司)、Microsoft(微軟)、Northern Telecom聯絡制定的。   USB1.1標準介面傳輸速率為12Mbps,但是一個USB裝置最多隻可以得到6Mbps的傳輸頻寬。因此若要外接光碟機,至多能接六倍速光碟機,無法再高。而若要即時播放MPEG-1的VCD影片,至少要1.5Mbps的傳輸頻寬,這點USB辦得到,但是要完成資料量大四倍的MPEG-2的DVD影片播放,USB可能就很吃力了,若再加上AC-3音訊資料,USB裝置就很難實現即時播放了。   一個USB介面理論上可以支援127個裝置,但是目前還無法達到這個數字。其實,對於一臺計算機,所接的周邊外設很少有超過10個的,因此這個數字是足夠我們使用的。   USB還有一個顯著優點就是支援熱插拔,也就是說在開機的情況下,你也可以安全地連線或斷開USB裝置,達到真正的即插即用。不過,並非所有的Windows系統都支援USB。目前,Windows系統中有許多不同的版本,在這些版本中,只有Windows98以上版本的系統對USB的支援較好,而其他的Windows版本並不能完整支援USB。例如Windows95的零售版是不支援USB的,只有後來與PC捆綁銷售的Windows95版本才支援USB。   目前USB裝置雖已被廣泛應用,比較普遍的是USB2.0介面,它的傳輸速度為480Mbps。使用者的需求,是促進科技發展的動力,廠商也同樣認識到了這個瓶頸。這時, COMPAQ、Hewlett Packard、Intel、Lucent、Microsoft、NEC和PHILIPS這7家廠商聯合制定了USB 2.0介面標準。USB 2.0將裝置之間的資料傳輸速度增加到了480Mbps,比USB 1.1標準快40倍左右,速度的提高對於使用者的最大好處就是意味著使用者可以使用到更高效的外部裝置,而且具有多種速度的周邊裝置都可以被連線到USB 2.0的線路上,而且無需擔心資料傳輸時發生瓶頸效應。   所以,如果你用USB 2.0的掃描器,就完全不同了,掃一張4M的圖片只需0.1秒鐘左右的時間,一眨眼就過去了,效率大大提高。   而且,USB2.0可以使用原來USB定義中同樣規格的電纜,接頭的規格也完全相同,在高速的前提下一樣保持了USB 1.1的優秀特色,並且,USB 2.0的裝置不會和USB 1.X裝置在共同使用的時候發生任何衝突。   USB2.0相容USB1.1,也就是說USB1.1裝置可以和USB2.0裝置通用,但是這時USB2.0裝置只能工作在全速狀態下(12Mbit/s)。USB2.0有高速、全速和低速三種工作速度,高速是480Mbit/s,全速是12Mbit/s,低速是1.5Mbit/s。其中全速和低速是為相容USB1.1和USB1.0而設計的,因此選購USB產品時不能只聽商家宣傳USB2.0,還要搞清楚是高速、全速還是低速裝置。USB匯流排是一種單向匯流排,主控制器在PC機上,USB裝置不能主動與PC機通訊。為解決USB裝置互通訊問題,有關廠商又開發了USB OTG標準,允許嵌入式系統通過USB介面互相通訊,從而甩掉了PC機。   新USB2.0規範重新命名了USB標準將原先的USB 1.1改成了USB 2.0 Full Speed(全速版),同時將原有的USB 2.0改成了USB 2.0High-Speed(高速版),並同時公佈了新的標識。不言而喻,高速版的USB 2.0速度當然超過全速版的USB 2.0。   電腦USB埠可以提供最大電流為500mA。
基本特性
1.USB的硬體結構
  USB採用四線電纜,其中兩根是用來傳送資料的序列通道,另兩根為下游(Downstream)裝置提供電源,對於高速且需要高頻寬的外設,USB以全速12Mbps的傳輸資料;對於低速外設,USB則以1.5Mbps的傳輸速率來傳輸資料。USB匯流排會根據外設情況在兩種傳輸模式中自動地動態轉換。USB是基於令牌的匯流排。類似於令牌環網路或FDDI基於令牌的匯流排。USB主控制器廣播令牌,總線上裝置檢測令牌中的地址是否與自身相符,通過接收或傳送資料給主機來響應。USB通過支援懸掛/恢復操作來管理USB匯流排電源。USB系統採用級聯星型拓撲,該拓撲由三個基本部分組成:主機(Host),集線器(Hub)和功能裝置。   主機,也稱為根,根結或根Hub,它做在主機板上或作為適配卡安裝在計算機上,主機包含有主控制器和根集線器(Root Hub),控制著USB總線上的資料和控制資訊的流動,每個USB系統只能有一個根集線器,它連線在主控制器上。   集線器是USB結構中的特定成分,它提供叫做埠(Port)的點將裝置連線到USB總線上,同時檢測連線在總線上的裝置,併為這些裝置提供電源管理,負責匯流排的故障檢測和恢復。集線可為匯流排提供能源,亦可為自身提供能源(從外部得到電源),自身提供能源的裝置可插入匯流排提供能源的集線器中,但匯流排提供能源的裝置不能插入自身提供能源的集線器或支援超過四個的下游埠中,如匯流排提供能源裝置的需要超過100mA電源時,不能同匯流排提供電源的集線器連線。   功能裝置通過埠與匯流排連線。USB同時可做Hub使用。
2.USB的軟體結構
  每個USB只有一個主機,它包括以下幾層:   (1)USB匯流排介面   USB匯流排介面處理電氣層與協議層的互連。從互連的角度來看,相似的匯流排介面由裝置及主機同時給出,例如序列介面機(SIE)。USB匯流排介面由主控制器實現。   (2)USB系統   USB系統用主控制器管理主機與USB裝置間的資料傳輸。它與主控制器間的介面依賴於主控制器的硬體定義。同時,USB系統也負責管理USB資源,例如頻寬和匯流排能量,這使客戶訪問USB成為可能。USB系統還有三個基本元件:   主控制器驅動程式(HCD)這可把不同主控制器裝置對映到USB系統中。HCD與USB之間的介面叫HCDI,特定的HCDI由支援不同主控制器的作業系統定義,通用主控制器驅動器(UHCD)處於軟結構的最底層,由它來管理和控制主控制器。UHCD實現了與USB主控制器通訊和控制USB主控制器,並且它對系統軟體的其他部分是隱蔽的。系統軟體中的最高層通過UHCD的軟體介面與主控制器通訊。   USB驅動程式(USBD)它在UHCD驅動器之上,它提供驅動器級的介面,滿足現有裝置驅動器設計的要求。USBD以I/O請求包(IRPs)的形式提供資料傳輸架構,它由通過特定管道(Pipe)傳輸資料的需求組成。此外,USBD使客戶端出現裝置的一個抽象,以便於抽象和管理。作為抽象的一部分,USBD擁有預設的管道。通過它可以訪問所有的USB裝置以進行標準的USB控制。該預設管道描述了一條USBD和USB裝置間通訊的邏輯通道。   主機軟體 在某些作業系統中,沒有提供USB系統軟體。這些軟體本來是用於向裝置驅動程式提供配置資訊和裝載結構的。在這些作業系統中,裝置驅動程式將應用提供的介面而不是直接訪問USBDI(USB驅動程式介面)結構。   (3)USB客戶軟體   它是位於軟體結構的最高層,負責處理特定USB裝置驅動器。客戶程式層描述所有直接作用於裝置的軟體入口。當裝置被系統檢測到後,這些客戶程式將直接作用於外圍硬體。這個共享的特性將USB系統軟體置於客戶和它的裝置之間,這就要根據USBD在客戶端形成的裝置映像由客戶程式對它進行處理。   主機各層有以下功能:   檢測連線和移去的USB裝置。   管理主機和USB裝置間的資料流。   連線USB狀態和活動統計。   控制主控制器和USB裝置間的電氣介面,包括限量能量供應。   HCD提供了主控制器的抽象和通過USB傳輸的資料的主控制器視角的一個抽象。USBD提供了USB裝置的抽象和USBD客戶與USB功能間資料傳輸的一個抽象。USB系統促進客戶和功能間的資料傳輸,並作為USB裝置的規範介面的一個控制點。USB系統提供緩衝區管理能力並允許資料傳輸同步於客戶和功能的需求。
3.USB的資料流傳輸
  主控制器負責主機和USB裝置間資料流的傳輸。這些傳輸資料被當作連續的位元流。每個裝置提供了一個或多個可以與客戶程式通訊的介面,每個介面由0個或多個管道組成,它們分別獨立地在客戶程式和裝置的特定終端間傳輸資料。USBD為主機軟體的現實需求建立了介面和管道,當提出配置請求時,主控制器根據主機軟體提供的引數提供服務。   USB支援四種基本的資料傳輸模式:控制傳輸,等時傳輸,中斷傳輸及資料塊傳輸。每種傳輸模式應用到具有相同名字的終端,則具有不同的性質。   控制傳輸型別 支援外設與主機之間的控制,狀態,配置等資訊的傳輸,為外設與主機之間提供一個控制通道。每種外設都支援控制傳輸型別,這樣主機與外設之間就可以傳送配置和命令/狀態資訊。   等時(lsochronous)傳輸型別 支援有周期性,有限的時延和頻寬且資料傳輸速率不變的外設與主機間的資料傳輸。該型別無差錯校驗,故不能保證正確的資料傳輸,支援像計算機-電話整合系統(CTI)和音訊系統與主機的資料傳輸。   中斷傳輸型別 支援像遊戲手柄,滑鼠和鍵盤等輸入裝置,這些裝置與主機間資料傳輸量小,無週期性,但對響應時間敏感,要求馬上響應。   資料塊(Bulk)傳輸型別 支援印表機,掃描器,數碼相機等外設,這些外設與主機間傳輸的資料量大,USB在滿足頻寬的情況下才進行該型別的資料傳輸。   USB採用分塊頻寬分配方案,若外設超過當前頻寬分配或潛在的要求,則不能進入該裝置。同步和中斷傳輸型別的終端保留頻寬,並保證資料按一定的速率傳送。集中和控制終端按可用的最佳頻寬來傳輸傳輸資料。
USB vs IEEE1394
一、USB與IEEE1394的相同點主要有哪些?
  兩者都是一種通用外接裝置介面。   兩者都可以快速傳輸大量資料。   兩者都能連線多個不同裝置。   兩者都支援熱插撥。   兩者都可以不用外部電源。
二、USB與IEEE1394的不同點有哪些?
  兩者的傳輸速率不同。USB最高的速度可達5Gb/s,但由於USB3.0尚未普及,目前主流的USB2.0只有480Mb/s,並且速度不穩定;相比之下,IEEE1394目前的速度雖然只有800Mb/s,但較為穩定,故在數碼相機等高速裝置中還保留了IEEE1394介面,但也開始採用USB介面了。   兩者的結構不同。USB在連線時必須至少有一臺電腦,並且必須需要HUB來實現互連,整個網路中最多可連線127臺裝置。IEEE1394並不需要電腦來控制所有裝置,也不需要HUB,IEEE1394可以用網橋連線多個IEEE1394網路,也就是說在用IEEE1394實現了63臺IEEE1394裝置之後也可以用網橋將其他的IEEE1394網路連線起來,達到無限制連線。   兩者的智慧化不同。IEEE1394網路可以在其裝置進行增減時自動重設網路。USB是以HUB來判斷連線裝置的增減了。   兩者的應用程度不同。現在USB已經被廣泛應用於各個方面,幾乎每臺PC主機板都設定了USB介面,USB2.0也會進一步加大USB應用的範圍。IEEE1394現在只被應用於音訊、視訊等多媒體方面。
USB的擴充套件應用及發展趨勢
前置USB介面
  前置USB介面是位於機箱前面板上的USB擴充套件介面。目前,使用USB介面的各種外部裝置越來越多,例如行動硬碟、快閃記憶體盤、數碼相機等等,但在使用這些裝置(特別是經常使用的移動儲存裝置)時每次都要鑽到機箱後面去使用主機板板載USB介面顯然是不方便的。前置USB介面在這方面就給使用者提供了很好的易用性。目前,前置USB介面幾乎已經成為機箱的標準配置,沒有前置USB介面的機箱已經非常少見了。   前置USB介面要使用機箱所附帶的USB連線線連線到主機板上所相應的前置USB插針(一般是8針、9針或10針,兩個USB成對,其中每個USB使用4針傳輸訊號和供電)上才能使用。在連線前置USB介面時一定要事先仔細閱讀主機板說明書和機箱說明書中與其相關的內容,千萬不可將連線接錯,不然會造成USB裝置或主機板的損壞。   另外,由於USB2.0介面輸出電壓為5V,輸出電流為500mA。使用前置USB介面時要注意前置USB介面供電不足的問題,在使用耗電較大的USB裝置時,要使用外接電源或直接使用機箱後部的主機板板載USB介面,以避免USB裝置不能正常使用或被損壞。
USB口硬碟盒
  目前的主流,其最大優點是使用方便,支援熱插拔和即插即用。USB有兩種標準:一種是USB1.1介面,其傳輸速度只有12Mbps,一種是USB2.0介面,其傳輸速度高達480Mbps。目前的主機板上的USB都支援USB1.1,但USB 2.0只有較新的主機板才能支援,購買時根據個人情況選擇產品,雖然USB2.0向下相容USB1.1,但支援USB2.0介面的行動硬碟盒比USB1.1的要貴一些。
無線USB
  USB開發者論壇的主席兼英特爾公司的技術策略官Jeff Ravencraft表示,無線USB技術將幫助使用者在使用個人電腦連線印表機、數碼相機、音樂播放器和外接磁碟驅動器等裝置時,從紛繁複雜的電纜連線中解放出來。無線USB標準的資料傳輸速率與目前的有線USB 2.0標準是一樣的,均為每秒480M,兩者的區別在於無線USB要求在個人電腦或外設中裝備無線收發裝置以代替電纜連線。   在英特爾開發者論壇舉辦的前夕,Ravencraft稱,首先採用這一標準的將是外接磁碟驅動器、數碼相機和印表機。而越來越多的產品將在今年第三季度開始推向市場。   為了使無線USB標準得以實用,必須改善這一技術的一些不足。USB標準小組宣佈了無線聯盟規範,以確保只有經過認證才能讓電腦和外設通過無線USB連線起來。   Ravencraft補充,一直以來USB標準已經廣泛的用於將數碼相機、掃描器、手機、PDA、DVD燒錄機和其他裝置與個人電腦的連線。而無線聯盟規範則詳細規定了個人電腦和外設如何通過無線USB進行連線,一臺電腦最多可以同時連線127個外設。   無線聯盟規範規定了兩種建立連線的方法。第一種方法是電腦和外設先用電纜連線起來,然後再建立無線連線以供以後使用。第二種方法是外設可以提供一串數字,使用者在建立連線的時候輸入到電腦裡面。   無線USB採用超寬頻技術進行通訊。目前無線區域網的802.11g協議採用位於2.4GHz附近的一小段頻帶進行通訊,而超寬頻技術則採用從3.1GHz到10.6GHz的頻帶進行通訊。超寬頻的訊號水平足夠低,因此對於其他無線通訊技術來說,超寬頻訊號的影響類似於噪聲。   無線網路目前廣泛使用的技術是IEEE的802.11標準,也就是英特爾所推動的Wi-Fi。這一技術廣泛的使用在膝上型電腦上,甚至部分尼康公司和佳能公司的數碼相機也採用這一技術。而無線USB技術則是一個完全不同的技術,由於這一技術實現上相對簡單同時功耗只有802.11的一半,因此不少廠商都更願意採用無線USB技術。   Ravencraft表示,在高階的手機和數碼相機上採用802.11技術,關鍵是要解決電池壽命問題。而廠商們發現超寬頻技術是解決這一問題的最好的辦法。   在距離電腦10英尺範圍內,無線USB裝置的傳輸速率將保持每秒480M。如果在30英尺範圍內,傳輸速率將下降到每秒110M。然而隨著技術的發展,無線USB的傳輸速率將會超過每秒1G甚至更快。   目前超寬頻技術不僅可以用於無線USB連線中,還可以在藍芽和IEEE的1394火線連線甚至WiNet短距離連線中使用。
USB的不同介面與資料線
  隨著各種數碼裝置的大量普及,特別是MP3和數碼相機的普及,我們周圍的USB裝置漸漸多了起來。然而這些裝置雖然都是採用了USB介面,但是這些裝置的資料線並不完全相同。
USB介面(12張)這些資料線在連線PC的一端都是相同的,但是在連線裝置端的時候,通常出於體積的考慮而採用了各種不同的介面。   絕大部分數碼產品連線線的接頭除了連在PC上的都一樣,另外一頭也都是遵循著標準的規格。   USB是一種統一的傳輸規範,但是介面有許多種,最常見的就是咱們電腦上用的那種扁平的,這叫做A型口,裡面有4根連線,根據誰插接誰分為公母介面,一般線上帶的是公口,機器上帶的是母口。
USB A型公口
  右上面的圖片是最常見的USB A型公口   常見Mini B型5Pin介面:   接下來就是在數碼產品上最常見的介面了,由於數碼產品體積所限,所以通常用的是Mini B型介面,但是Mini B型介面也有許多種類。
Mini B型5Pin
  右面的圖為Mini B型5Pin介面示意圖  
  這種介面可以說是目前最常見的一種介面了,這種介面由於防誤插效能出眾,體積也比較小巧,所以正在贏得越來越多的廠商青睞,現在這種介面廣泛出現在讀卡器、MP3、數碼相機以及行動硬碟上。   下圖為:Sony F828上的Mini B型5Pin介面   目前採用這種介面的裝置目前有SONY相機、攝像機和MP3,Olympus相機和錄音筆,佳能相機和惠普的數碼相機等等,數量相當繁多。   常見Mini B型4Pin介面:   除了前面我們看到的最常見的Mini B型5Pin的介面以外,Mini B型還有很多種別的介面,其中的一些也比較常見。
Mini B型4Pin
  右圖為:Mini B型4Pin的介面   下圖為:Mini B型4Pin的介面的轉接線纜   這種介面常見於以下品牌的數碼產品:奧林巴斯的C系列和E系列,柯達的大部分數碼相機,三星的MP3產品(如Yepp),SONY的DSC系列,康柏的IPAQ系列產品……   富士Mini B型4Pin Flat介面:   Mini B型4Pin還有一種形式,那就是Mini B型4Pin Flat。顧名思義,這種介面比Mini B型4Pin要更加扁平,在裝置中的應用也比較廣泛。
富士Mini B型4Pin Flat
  右圖為:Mini B型4Pin Flat介面   這種介面和前面講腗INI B型4pin非常類似,但是這種接頭更為扁平,所佔用的體積更小。   這種介面常見於以下裝置:富士的FinePix系列,卡西歐的QV系列相機,柯尼卡的產品。   我們看到,富士的機器用這種介面的比較多,幾乎舊有的機型全是這種介面。不過值得注意的是,富士在最新的S5000和S7000上已經放棄了這種介面,改投Mini B 5Pin的陣營。   尼康獨有,Mini B型8Pin介面:   Mini B型除了前面的4Pin和5Pin的,還有一種就是8Pin的了,這種接頭在其他裝置上出現的機率就非常少了,通常出現在數碼相機上。Mini B型的介面也有3種,一種是普通型的,一種是Round(圓)型的,還有一種是2×4佈局的扁平介面。
MINI B型8Pin
  右圖為:Mini B型8Pin的介面   這種介面適用的裝置,據筆者所知目前只有Nikon Coolpix 775一個款型的產品使用這種介面。
Mini B型8Pin Round
  左圖為:Mini B型8Pin Round介面   這種介面和前面的普通型比起來,就是將原來的D型接頭改成了圓形接頭,並且為了防止誤插在一邊設計了一個凸起。   這種接頭可以見於一些Nikon的數碼相機,CoolPix系列比較多見。雖然Nikon一直堅持用這種介面,但是在一些較新的機型中,例如D100和CP2000也都採用了普及度最高的Mini B型5Pin介面。   差點兒就普及,8Pin 2×4介面:   除了我們前面見過的Mini B型5Pin的介面,我想大家一定還對下面這種介面非常熟悉,這種介面也曾經相當的普及。
Mini B型8Pin 2×4
  圖為:Mini B型8Pin 2×4介面   這種介面也是一種比較常見的介面了,例如我們熟悉的iRiver的著名的MP3系列,其中號稱“鐵三角”的180TC,以及該系列的很多其他產品採用的均是這種介面。這種介面的應用範圍也還算是廣,不過從iRiver自3XX系列全面換成Mini B型5Pin的介面後,這種規格明顯沒有Mini B型5Pin搶眼了。   對應部分圖片:  常見USB圖片

USB On-The-Go補充標準
  USB On-The-Go Supplement 1.0:2001年12月釋出。USB On-The-Go Supplement 1.0a:2003年6月釋出,即當前版本。   USB OTG是USB On-The-Go的縮寫,是近年發展起來的技術,2001年12月18日由USB Implementers Forum公佈,主要應用於各種不同的裝置或移動裝置間的聯接,進行資料交換。特別是PDA、行動電話、消費類裝置。改變如數碼照相機、攝像機、印表機等裝置間多種不同制式聯結器,多達7種制式的儲存卡間資料交換的不便。   USB技術的發展,使得PC和周邊裝置能夠通過簡單方式、適度的製造成本將各種資料傳輸速度的裝置連線在一起,上述我們提到應用,都可以通過USB匯流排,作為PC的周邊,在PC的控制下進行資料交換。但這種方便的交換方式,一旦離開了PC,各裝置間無法利用USB口進行操作,因為沒有一個從裝置能夠充當PC一樣的Host。   On-The-Go,即OTG技術就是實現在沒有Host的情況下,實現從裝置間的資料傳送。例如數碼相機直接連線到印表機上,通過OTG技術,連線兩臺裝置見的USB口,將拍出的相片立即打印出來;也可以將數碼照相機中的資料,通過OTG傳送到USB介面的行動硬碟上,野外操作就沒有必要攜帶價格昂貴的儲存卡,或者背一個便攜電腦。   在OTG產品中,增加了一些新的特性:   * 新的標準,適用於設計小巧的聯結器和電纜;   * 在傳統的周邊裝置上,增加了Host能力,適應點到點的連線;   * 這種能力可以在兩個裝置間動態地切換;   * 低的功耗,保證USB可以在電池供電情況下工作   使用OTG後,不影響原裝置和PC的連線,但使得在市場上已有超過10億個USB介面的裝置,也能通過OTG互聯。

下面我們來親自實踐基於Windows8與Visual Studio11的開發

Visual studio11與Windows8帶來格外不同的新體驗

 

1.啟動Vs11

2.看見滿目的驅動開發模板

3.選擇USB   程式模板USB ApplicationMVP

 

4.建立成功如下

 

5.編譯之

 

6.主程式如下

#include "pch.h"#include <stdio.h>LONG __cdecl_tmain(    LONG     Argc,    LPTSTR * Argv    )/*++Routine description:    Sample program that communicates with a USB device using WinUSB--*/{    DEVICE_DATA           deviceData;    HRESULT               hr;    USB_DEVICE_DESCRIPTOR deviceDesc;    BOOL                  bResult;    BOOL                  noDevice;    ULONG                 lengthReceived;    UNREFERENCED_PARAMETER(Argc);    UNREFERENCED_PARAMETER(Argv);    //    // Find a device connected to the system that has WinUSB installed using our    // INF    //    hr = OpenDevice(&deviceData, &noDevice);    if (FAILED(hr)) {        if (noDevice) {            printf(_T("Device not connected or driver not installed\n"));        } else {            printf(_T("Failed looking for device, HRESULT 0x%x\n"), hr);        }        return 0;    }    //    // Get device descriptor    //    bResult = WinUsb_GetDescriptor(deviceData.WinusbHandle,                                   USB_DEVICE_DESCRIPTOR_TYPE,                                   0,                                   0,                                   (PBYTE) &deviceDesc,                                   sizeof(deviceDesc),                                   &lengthReceived);    if (FALSE == bResult || lengthReceived != sizeof(deviceDesc)) {        printf(_T("Error among LastError %d or lengthReceived %d\n"),               FALSE == bResult ? GetLastError() : 0,               lengthReceived);        CloseDevice(&deviceData);        return 0;    }    //    // Print a few parts of the device descriptor    //    printf(_T("Device found: VID_%04X&PID_%04X; bcdUsb %04X\n"),           deviceDesc.idVendor,           deviceDesc.idProduct,           deviceDesc.bcdUSB);    CloseDevice(&deviceData);    return 0;}


 

7.裝置程式程式碼如下

#include "pch.h"#include <SetupAPI.h>HRESULTRetrieveDevicePath(    _Out_bytecap_(BufLen) LPTSTR DevicePath,    _In_                  ULONG  BufLen,    _Out_opt_             PBOOL  FailureDeviceNotFound    );HRESULTOpenDevice(    _Out_     PDEVICE_DATA DeviceData,    _Out_opt_ PBOOL        FailureDeviceNotFound    )/*++Routine description:    Open all needed handles to interact with the device.    If the device has multiple USB interfaces, this function grants access to    only the first interface.    If multiple devices have the same device interface GUID, there is no    guarantee of which one will be returned.Arguments:    DeviceData - Struct filled in by this function. The caller should use the        WinusbHandle to interact with the device, and must pass the struct to        CloseDevice when finished.    FailureDeviceNotFound - TRUE when failure is returned due to no devices        found with the correct device interface (device not connected, driver        not installed, or device is disabled in Device Manager); FALSE        otherwise.Return value:    HRESULT--*/{    HRESULT hr = S_OK;    BOOL    bResult;    DeviceData->HandlesOpen = FALSE;    hr = RetrieveDevicePath(DeviceData->DevicePath,                            sizeof(DeviceData->DevicePath),                            FailureDeviceNotFound);    if (FAILED(hr)) {        return hr;    }    DeviceData->DeviceHandle = CreateFile(DeviceData->DevicePath,                                          GENERIC_WRITE | GENERIC_READ,                                          FILE_SHARE_WRITE | FILE_SHARE_READ,                                          NULL,                                          OPEN_EXISTING,                                          FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,                                          NULL);    if (INVALID_HANDLE_VALUE == DeviceData->DeviceHandle) {        hr = HRESULT_FROM_WIN32(GetLastError());        return hr;    }    bResult = WinUsb_Initialize(DeviceData->DeviceHandle,                                &DeviceData->WinusbHandle);    if (FALSE == bResult) {        hr = HRESULT_FROM_WIN32(GetLastError());        CloseHandle(DeviceData->DeviceHandle);        return hr;    }    DeviceData->HandlesOpen = TRUE;    return hr;}VOIDCloseDevice(    _Inout_ PDEVICE_DATA DeviceData    )/*++Routine description:    Perform required cleanup when the device is no longer needed.    If OpenDevice failed, do nothing.Arguments:    DeviceData - Struct filled in by OpenDeviceReturn value:    None--*/{    if (FALSE == DeviceData->HandlesOpen) {        //        // Called on an uninitialized DeviceData        //        return;    }    WinUsb_Free(DeviceData->WinusbHandle);    CloseHandle(DeviceData->DeviceHandle);    DeviceData->HandlesOpen = FALSE;    return;}HRESULTRetrieveDevicePath(    _Out_bytecap_(BufLen) LPTSTR DevicePath,    _In_                  ULONG  BufLen,    _Out_opt_             PBOOL  FailureDeviceNotFound    )/*++Routine description:    Retrieve the device path that can be used to open the WinUSB-based device.    If multiple devices have the same device interface GUID, there is no    guarantee of which one will be returned.Arguments:    DevicePath - On successful return, the path of the device (use with CreateFile).    BufLen - The size of DevicePath's buffer, in bytes    FailureDeviceNotFound - TRUE when failure is returned due to no devices        found with the correct device interface (device not connected, driver        not installed, or device is disabled in Device Manager); FALSE        otherwise.Return value:    HRESULT--*/{    BOOL                             bResult = FALSE;    HDEVINFO                         deviceInfo;    SP_DEVICE_INTERFACE_DATA         interfaceData;    PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;    ULONG                            length;    ULONG                            requiredLength=0;    HRESULT                          hr;    if (NULL != FailureDeviceNotFound) {        *FailureDeviceNotFound = FALSE;    }    //    // Enumerate all devices exposing the interface    //    deviceInfo = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USBApplicationMVP,                                     NULL,                                     NULL,                                     DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    if (deviceInfo == INVALID_HANDLE_VALUE) {        hr = HRESULT_FROM_WIN32(GetLastError());        return hr;    }    interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);    //    // Get the first interface (index 0) in the result set    //    bResult = SetupDiEnumDeviceInterfaces(deviceInfo,                                          NULL,                                          &GUID_DEVINTERFACE_USBApplicationMVP,                                          0,                                          &interfaceData);    if (FALSE == bResult) {        //        // We would see this error if no devices were found        //        if (ERROR_NO_MORE_ITEMS == GetLastError() &&            NULL != FailureDeviceNotFound) {            *FailureDeviceNotFound = TRUE;        }        hr = HRESULT_FROM_WIN32(GetLastError());        SetupDiDestroyDeviceInfoList(deviceInfo);        return hr;    }    //    // Get the size of the path string    // We expect to get a failure with insufficient buffer    //    bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo,                                              &interfaceData,                                              NULL,                                              0,                                              &requiredLength,                                              NULL);    if (FALSE == bResult && ERROR_INSUFFICIENT_BUFFER != GetLastError()) {        hr = HRESULT_FROM_WIN32(GetLastError());        SetupDiDestroyDeviceInfoList(deviceInfo);        return hr;    }    //    // Allocate temporary space for SetupDi structure    //    detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)        LocalAlloc(LMEM_FIXED, requiredLength);    if (NULL == detailData)    {        hr = E_OUTOFMEMORY;        SetupDiDestroyDeviceInfoList(deviceInfo);        return hr;    }    detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);    length = requiredLength;    //    // Get the interface's path string    //    bResult = SetupDiGetDeviceInterfaceDetail(deviceInfo,                                              &interfaceData,                                              detailData,                                              length,                                              &requiredLength,                                              NULL);    if(FALSE == bResult)    {        hr = HRESULT_FROM_WIN32(GetLastError());        LocalFree(detailData);        SetupDiDestroyDeviceInfoList(deviceInfo);        return hr;    }    //    // Give path to the caller. SetupDiGetDeviceInterfaceDetail ensured    // DevicePath is NULL-terminated.    //    hr = StringCbCopy(DevicePath,                      BufLen,                      detailData->DevicePath);    LocalFree(detailData);    SetupDiDestroyDeviceInfoList(deviceInfo);    return hr;}


 

趕緊下載VS11體驗吧

http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200098144

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述