前面學習了USB相機硬件固件、設備驅動,可以實現USB設備識別、數據發送的功能。然后,非常重要的一部分,USB設備發出的數據,我要怎么接受,怎么查看發送的數據是否是正確的。網上百度了下,大部分人都使用的是C++的開發平台,而我想在.NET下使用C#制作上位機來實現USB設備數據的接收以及數據的顯示,這里的數據為圖像數據。查找了很久,C#部分的設計確實很少,大體的思路都有說道,但是更加清晰詳細的解釋沒有。下面就針對我這幾天查閱的資料作一分享:
基於VS開發平台,.NET架構下C#的USB設備編程,需要有以下幾部分:
1、設備驅動CyUSB.SYS:提供設備描述相關信息,用於系統設備管理器識別設備;
2、.NET平台下的動態鏈接庫CyUSB.dll:提供USB控制相關函數;
3、VS開發平台:用來進行上位機程序編譯,生成可執行文件;
這里主要介紹下CyUSB.DLL中的一些USB控制函數
(1)USB控制類函數
(2)USBDeviceList類
USBDeviceList 函數
用於獲取當前計算機連接的所有USB設備列表,
函數原型:public USBDeviceList(byte DeviceMask)
參數DeviceMask用於表示設備的類型。支持CyUSB驅動、USB HID設備和USB大容量存儲設備的識別,取值如下:
CyConst.DEVICE_CYUSB:使用CyUSB驅動的USB設備
CyConst.DEVICE_MSC:USB大容量存儲設備
CyConst.DEVICE_HID:USB HID設備
USBDeviceList函數在程序中使用方式:
聲明:USBDeviceList usbDevices;
使用:usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB); //獲取連接的CyUSB設備
Count成員變量
原型:public int Count(get;)
使用:
USBDeviceList usbDevices;
usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB); //獲取連接的CyUSB設備
if(usbDevices.Count > 0)
{
//執行設備操作
}
Dispose函數
原型:public void Dispose()
使用:
先獲取設備列表
USBDeviceList usbDevices;
usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB); //獲取連接的CyUSB設備
在使用退出時,調用Dispose函數釋放USB資源
usbDevices.Dispose();
USBDeviceList[...]成員變量
使用:通過后面括號中的值,來尋找相對應的USB設備。
(3)CyUSBDevice類
通過該類中的一些方法可以獲取USB設備的信息及各類屬性參數。比如:BCD碼、設備類信息、協議信息、子類信息、驅動名稱信息、制造商名稱信息等等。
(4)CyControlEndPoint類
該類提供了USB設備控制端點的讀寫和設置,通過該類中的函數及成員變量可以實現USB設備的控制傳輸操作。這個在USB數據收發過程中相當重要。
XferData函數
通過當前USB控制端點執行一次控制傳輸
原型:unsafe public new bool_XferData(ref byte[] buf, ref int len)
使用:
CyControlEndPoint CtrlEndPt = null;
CtrlEndPt.Target = CyConst.TGT_DEVICE;
CtrlEndPt.ReqType = CyConst.REQ_VENDOR;
CtrlEndPt.Direction = CyConst.DIR_TO_DEVICE;
CtrlEndPt.ReqCode = x;
CtrlEndPt.Value = 0;
CtrlEndPt.Index = 0;
CtrlEndPt.XferData(ref buf, ref len); //參數buf表示控制傳輸的緩沖區,參數len表示控制傳輸的字節數。
(5)CylsocEndPoint類
用於同步傳輸端點控制,是CyUSBEndPoint的一個子類。同步傳輸端點控制類CylsocEndPoint提供了對同步端點的定義和函數支持,其函數列表如下: