C# USB接口與設備通信

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盤數據,這個沒有研究,也許哪天有空了再去查查。
鏈接: 示例代碼.

示例界面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章