以前看 USB 協議 2.0 的時候,有個認識上的誤區,認為所謂的復合設備,必須是兩個物理上相獨立的 USB 設備(兩個 USB Device ,兩個 USB 地址,只是在同一條 USB 總線而已)。最近在開發 .Net Micro Framewok 的 USB 雙接口功能時,才明白復合設備原來也可以是這樣實現 !
對 USB 設備來說,至少會有一個 USB 配置,而這個配置可以包括一到多個接口,而一個接口又可以包括多個端點。對 Windows 平臺來說,每一個接口在邏輯上對應一個虛擬設備,可以分別安裝不同的驅動(視接口的配置來定,即使兩個接口配置一樣,也需要安裝兩次相同的驅動),但從表面上看和兩個真實的物理 USB 設備沒有什么不同。
1 為什么要實現雙接口
有在 .Net Micro Framework 調試 SideShow 經驗的用戶,就會有特別深的感觸,因為 SideShow 通信是基于 USB ,而大部分 .Net Micro Framework 調試口也是基于 USB ,由于只有一個接口,所以 PC 端要么安裝 SideShow 驅動,要么安裝 .Net Micro Frame USB 設備驅動,二者不能共存(當然讓兩個驅動共存,也可以設置不同的 PID 和 VID ,但是這樣就需要在 .Net Micro Frame 開發板上進行相應的配置了),別說在線調試了,光編譯下載,就不知道要折騰好幾回。
所以對只有一個 USB Debug 口的開發板,要調試 USB 相關例程是非常痛苦的。
而 USB 雙接口的方案就是為解決該問題而生。同時有兩個 USB 接口,即可以安裝兩個不同的驅動,也可以在線調試 USB 例程。這是多么一個令人神往的特性,尤為可喜的是這已經不僅僅是個意境,現如今已成為現實。目前我們已經測試通過的有: Debug+Mass Storage ( U 盤), Debug+HID (鼠標), Debug+Application (應用口)。當然也可以根據需要配置成三個、四個設置或多個你任意想要的接口。
2 支持雙接口,需要做些什么
.Net Micro Framework USB 接口模型
第一、 修改 .Net Micro Framework 的 USB 接口配置,把一個接口修改成兩個接口;
第二、 修改 .Net Micro Framework 的 USB 接口驅動,以前僅支持端點 1 和端點 2 ,目前增加對端點 3 和端點 4 的支持。邏輯上接口 1 包括端點 1 和端點 2 ,接口 2 包括端點 3 和端點 4 ;
第三、 修改 PAL 層接口,增加端點 3 和端點 4 的讀寫接口函數;
第四、 編寫 P/Invoke 接口,讓 C# 程序也可以讀寫端點 3 和端點 4 的數據(端點 1 和端點 2 默認供調試程序讀寫用);
第五、 修改 .Net Micro Frame USB Windows 驅動,讓其支持雙接口。(當然如果你的接口配置為 HID 或 Mass Storage ,那就不需要開發專門的驅動了);
第六、 剩下的就是測試再測試了。
3 一個雙接口通信的例子
驅動程序等等安裝完畢,準備停當之后,我們需要編寫兩部分程序來調試 USB 應用。一是普通 Windows USB 讀寫程序,這個程序我在以前寫的 Blog 上已經介紹了( http://blog.csdn.net/yefanqiu/archive/2009/01/21/3849067.aspx )這里就不多說了;二是開發一個 .Net Micro Frame USB Device 應用程序,來響應 Windows 平臺的 USB 讀寫程序。
我們的程序很簡單,實現一個轉發功能,也就是把 Windows 平臺的 USB 程序發送的數據,原封不動的發送回去。代碼如下:
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();
}
}
}
注:測試時, VS2008 可以一直處在調試模式(可即時打印調試信息),此時 USB Test 程序同時完成數據收發。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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