以前看 USB 協(xié)議 2.0 的時(shí)候,有個(gè)認(rèn)識(shí)上的誤區(qū),認(rèn)為所謂的復(fù)合設(shè)備,必須是兩個(gè)物理上相獨(dú)立的 USB 設(shè)備(兩個(gè) USB Device ,兩個(gè) USB 地址,只是在同一條 USB 總線而已)。最近在開(kāi)發(fā) .Net Micro Framewok 的 USB 雙接口功能時(shí),才明白復(fù)合設(shè)備原來(lái)也可以是這樣實(shí)現(xiàn) !
對(duì) USB 設(shè)備來(lái)說(shuō),至少會(huì)有一個(gè) USB 配置,而這個(gè)配置可以包括一到多個(gè)接口,而一個(gè)接口又可以包括多個(gè)端點(diǎn)。對(duì) Windows 平臺(tái)來(lái)說(shuō),每一個(gè)接口在邏輯上對(duì)應(yīng)一個(gè)虛擬設(shè)備,可以分別安裝不同的驅(qū)動(dòng)(視接口的配置來(lái)定,即使兩個(gè)接口配置一樣,也需要安裝兩次相同的驅(qū)動(dòng)),但從表面上看和兩個(gè)真實(shí)的物理 USB 設(shè)備沒(méi)有什么不同。
1 為什么要實(shí)現(xiàn)雙接口
有在 .Net Micro Framework 調(diào)試 SideShow 經(jīng)驗(yàn)的用戶,就會(huì)有特別深的感觸,因?yàn)? SideShow 通信是基于 USB ,而大部分 .Net Micro Framework 調(diào)試口也是基于 USB ,由于只有一個(gè)接口,所以 PC 端要么安裝 SideShow 驅(qū)動(dòng),要么安裝 .Net Micro Frame USB 設(shè)備驅(qū)動(dòng),二者不能共存(當(dāng)然讓兩個(gè)驅(qū)動(dòng)共存,也可以設(shè)置不同的 PID 和 VID ,但是這樣就需要在 .Net Micro Frame 開(kāi)發(fā)板上進(jìn)行相應(yīng)的配置了),別說(shuō)在線調(diào)試了,光編譯下載,就不知道要折騰好幾回。
所以對(duì)只有一個(gè) USB Debug 口的開(kāi)發(fā)板,要調(diào)試 USB 相關(guān)例程是非常痛苦的。
而 USB 雙接口的方案就是為解決該問(wèn)題而生。同時(shí)有兩個(gè) USB 接口,即可以安裝兩個(gè)不同的驅(qū)動(dòng),也可以在線調(diào)試 USB 例程。這是多么一個(gè)令人神往的特性,尤為可喜的是這已經(jīng)不僅僅是個(gè)意境,現(xiàn)如今已成為現(xiàn)實(shí)。目前我們已經(jīng)測(cè)試通過(guò)的有: Debug+Mass Storage ( U 盤(pán)), Debug+HID (鼠標(biāo)), Debug+Application (應(yīng)用口)。當(dāng)然也可以根據(jù)需要配置成三個(gè)、四個(gè)設(shè)置或多個(gè)你任意想要的接口。
2 支持雙接口,需要做些什么
.Net Micro Framework USB 接口模型
第一、 修改 .Net Micro Framework 的 USB 接口配置,把一個(gè)接口修改成兩個(gè)接口;
第二、 修改 .Net Micro Framework 的 USB 接口驅(qū)動(dòng),以前僅支持端點(diǎn) 1 和端點(diǎn) 2 ,目前增加對(duì)端點(diǎn) 3 和端點(diǎn) 4 的支持。邏輯上接口 1 包括端點(diǎn) 1 和端點(diǎn) 2 ,接口 2 包括端點(diǎn) 3 和端點(diǎn) 4 ;
第三、 修改 PAL 層接口,增加端點(diǎn) 3 和端點(diǎn) 4 的讀寫(xiě)接口函數(shù);
第四、 編寫(xiě) P/Invoke 接口,讓 C# 程序也可以讀寫(xiě)端點(diǎn) 3 和端點(diǎn) 4 的數(shù)據(jù)(端點(diǎn) 1 和端點(diǎn) 2 默認(rèn)供調(diào)試程序讀寫(xiě)用);
第五、 修改 .Net Micro Frame USB Windows 驅(qū)動(dòng),讓其支持雙接口。(當(dāng)然如果你的接口配置為 HID 或 Mass Storage ,那就不需要開(kāi)發(fā)專(zhuān)門(mén)的驅(qū)動(dòng)了);
第六、 剩下的就是測(cè)試再測(cè)試了。
3 一個(gè)雙接口通信的例子
驅(qū)動(dòng)程序等等安裝完畢,準(zhǔn)備停當(dāng)之后,我們需要編寫(xiě)兩部分程序來(lái)調(diào)試 USB 應(yīng)用。一是普通 Windows USB 讀寫(xiě)程序,這個(gè)程序我在以前寫(xiě)的 Blog 上已經(jīng)介紹了( http://blog.csdn.net/yefanqiu/archive/2009/01/21/3849067.aspx )這里就不多說(shuō)了;二是開(kāi)發(fā)一個(gè) .Net Micro Frame USB Device 應(yīng)用程序,來(lái)響應(yīng) Windows 平臺(tái)的 USB 讀寫(xiě)程序。
我們的程序很簡(jiǎn)單,實(shí)現(xiàn)一個(gè)轉(zhuǎn)發(fā)功能,也就是把 Windows 平臺(tái)的 USB 程序發(fā)送的數(shù)據(jù),原封不動(dòng)的發(fā)送回去。代碼如下:
using System;
using Microsoft.SPOT;
using System.Threading;
using Microsoft.SPOT.Hardware;
namespace USBDeviceTest
{
public class Program
{
public static void Main()
{
byte [] bytData= new byte [1024];
YFInterop. MFNative .Usb_Open(0);
while ( true )
{
int intSize=YFInterop. MFNative .Usb_Available();
if (intSize > 0)
{
if (YFInterop. MFNative .Usb_Read(bytData, 0, intSize) == intSize)
{
string strData = intSize.ToString()+ ":" ;
for ( int i = 0; i < intSize; i++)
{
strData += bytData[i].ToString() + " " ;
}
Debug .Print(strData);
YFInterop. MFNative .Usb_Write(bytData, 0, intSize);
}
}
Thread .Sleep(3);
}
YFInterop. MFNative .Usb_Close();
}
}
}
注:測(cè)試時(shí), VS2008 可以一直處在調(diào)試模式(可即時(shí)打印調(diào)試信息),此時(shí) USB Test 程序同時(shí)完成數(shù)據(jù)收發(fā)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
