USB通信
這是我第一次直接使用USB接口與設備進行通信,第一反應就是打開指定設備,配置設備,讀取數據,關閉設備備。事後發現確實如此。在網上查看一番之後,花了金幣下載了一些代碼,但是似乎都有點不太對路。當然,底層的東西還是能用的,我就是通過調用前輩(自己去看代碼中的註釋)的一些接口(免去了安裝Libusbdot, CyUSB等)實現了與USB設備的交互。好了,接下來便說說。
打開指定設備
通過度娘,打開指定設備是通過設備的vid和pid來實現的,這哥倆是16進制的,因此我把方法的輸入參數定義成16進制字符串:
/// <summary>
/// 基於vid和pid打開指定設備
/// </summary>
/// <returns></returns>
public bool OpenDevice(string vid,string pid)
{
bool is_opened = false;
if (myHid.Opened == false)
{
UInt16 myVendorID = Convert.ToUInt16(vid, 16);// 0x1234;
UInt16 myProductID = Convert.ToUInt16(pid, 16); //0x5678;
if ((int)(myHidPtr = myHid.OpenDevice(myVendorID, myProductID)) != -1)
{
//MessageBox.Show("open drive success");
is_opened = true;
}
else
{
is_opened = false;
}
}
else
{
is_opened = true;
}
return is_opened;
}
配置設備
在打開設備之後就可以進行對設備進行操作了。但不是所有的設備都需要進行配置,我所用的設備配置,是可有可無的,這個需要根據設備的通信協議。
讀取數據
這一步操作也是需要根據通信協議進行。我所用的設備需要上位機下發16進制數據纔可以獲取數據,因此輸入的參數仍然是用16進制字符串,以空格作爲間隔,如 B3 56。
public double Send(string hexString)
{
is_data_received = false;
Byte[] data = HexStringToByte(hexString);
byte[] db = new byte[2];
double ddB = 0.0;
report r = new report(0, data);
if (myHid.Opened)
{
myHid.Write(r);
int i = 0;
while (!is_data_received && i<10)
{
System.Threading.Thread.Sleep(50);
i++;
}
if (is_data_received)
{
db[0] = RecDataBuffer[1];
db[1] = RecDataBuffer[0];
ddB = (System.BitConverter.ToUInt16(db, 0)) / 10.0;
}
}
is_data_received = false;
return ddB;
}
重點來了哈,那就是數據是怎麼來的:根據調用的類,需要訂閱數據接收事件。
myHid.DataReceived += new EventHandler<HID.report>(myhid_DataReceived); //訂閱DataRec事件
//數據到達事件
protected void myhid_DataReceived(object sender, report e)
{
RecDataBuffer = e.reportBuff;
is_data_received = true;
}
關閉設備
好了,不適用設備了,那就關閉它吧
public void CloseDevice()
{
if(myHid.Opened)
myHid.CloseDevice(myHidPtr);
}
示例
我這個只是與設備做簡單的通信,但可以把它改改,用於與其它設備通信。至於獲取U盤數據,這個沒有研究,也許哪天有空了再去查查。
鏈接: 示例代碼.