關於C#上位機的usb_hid通信相關問題說明

        最近在寫上位機,用到了hid通信,在網上查找了很多資料,終於通信成功。其中也遇到了一些問題,在此說明一下,希望可以幫到有需要的朋友。

        我是在網上找到了一個例程,將其移植了一下。開始接收數據沒問題,但是發送數據一直不成功,只有在一次性發送到數據大於64個字節是纔會發送,而且接收下位機發送回來的相同的數據也不對。折磨了我好幾天,終於在谷歌上搜到了相關信息。原來hid的report是有固定格式的。發送數據的時候,數組第一個byte是hid 的report id,一般是0;數組第二個byte是要發送的數據的長度。同樣的,接收到的數據,緩衝區裏第一個byte是id,,也就是0;第二個byte是接收到的數據的長度。我在網上搜索到的例程中並不是這樣的,他直接把緩衝區的數據全當作是接收到的數據,發送的時候也是直接發送數據,沒有按照report的格式,所以導致我通信不成功。一開始接收數據時,由於下位機發送到數據是有固定格式的,所以沒有分離出id和數據長度也沒有影響。

       附件裏是我修改過的例程,並且也多次測試過,發送和接收都沒有問題,有需要的朋友可以下載參考。我這裏再單獨提一下這個report的問題。

接收數據:

 private void ReadCompleted(IAsyncResult iResult)
        {
            byte[] readBuff = (byte[])(iResult.AsyncState);
            try
            {
                hidDevice.EndRead(iResult);//讀取結束,如果讀取錯誤就會產生一個異常
                byte[] reportData = new byte[readBuff.Length - 2];  ////////////////////////////////////////////第一個byte是id,第二個byte是數據長度,所以從readbuff[2]開始纔是真正接收到的數據
                for (int i = 2; i < readBuff.Length; i++)
                    reportData[i - 2] = readBuff[i];
                report e = new report(readBuff[0], reportData);
                OnDataReceived(e); //發出數據到達消息
                BeginAsyncRead();//啓動下一次讀操作
            }
            catch (IOException)//讀寫錯誤,設備已經被移除
            {
                EventArgs ex = new EventArgs();
                OnDeviceRemoved(ex);//發出設備移除消息
                CloseDevice();
            }

發送數據:

internal string WriteUSBHID(string sendValue)
        {
            try
            {
                //byte[] array = { 0xF5, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
                byte[] array = System.Text.ASCIIEncoding.Default.GetBytes(sendValue);
                byte[] arr = new byte[outputReportLength]; ////////////////////////////////////////////////////////////這裏注意:要發送的arr數組大小必須是outputReportLength
                arr[0] = 0x00;   /////////////////////////////////////第一個是id
                arr[1] = (byte)array.Length;////////////////////////////////第二個是數據長度
                for (int i = 2; i < array.Length + 2; i++)
                {
                    arr[i] = array[i - 2];
                }
                hidDevice.Write(arr, 0, arr.Length);  ///////////////////////////////原例程是直接發送array數組,導致通信失敗
                return sendValue;
            }
            catch (Exception e) {
                return e.Message ;
            }
        }

         最後,感謝原例程的作者,還要感謝偉大的谷歌(我是輸入英文查找的。百度上搜索的都是你抄我,我抄你的,沒有人講這個問題,也不知道是就我一個人遇到了,還是大家解決了不屑說又或者太保守不想告訴別人,唉!吐槽一下,請勿見怪。)

         再附上百度雲鏈接:鏈接:http://pan.baidu.com/s/1qYIZXrY 密碼:85hq  ;鏈接:http://pan.baidu.com/s/1kU6cE0Z 密碼:g8r2

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