新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 完成stm32上HID的應用

        完成stm32上HID的應用

        作者: 時間:2016-11-27 來源:網絡 收藏
        這個是公司的項目,以前基于usb的虛擬串口來做上下位機通信,由于usb平時也就刷參數和調試之用,也不很常用,外面反應usb有時會連不上stm32控制器,心里一直認為不是大問題,后來反應的多了,就重視這個事情了,雖然usb平時不用,但是用的時候只要出現異常掉線,就再也連不上去了,特別影響用戶對我們產品的信心。
        在網上找了很多資料,到現在也只能隱約確定是stm32官方的虛擬串口庫有問題,我發現不同的電源板都會影響到usb虛擬串口的枚舉,于是下定決心使用其他方式來做上下位機的連接,排除了usb虛擬串口,眼前的選擇只有兩個
        1)usblib,這個是針對usb的上位機庫,可以玩很多的花樣,但是需要開發者稍稍熟悉usb協議,而且這個需要在上位機上安裝usb驅動程序。
        2)hid設備,這個是windows自身支持的usb設備,只支持中斷傳輸,最大的速率也就64Kb/s,上位機采用windows api編程
        我估算了一下,hid方式滿足我的要求,而且是免驅動,又不用學習usblib,所以就使用hid方式實現了usb通信。
        hid幾個注意事項:
        1)對于windows API來說,讀和寫hid設備的數據包都是大小確定了,也就是說如果stm32 端口設備的hid屬性是64的話,那么讀寫都是64字節的。讀寫的最大幀是64字節,我在代碼中是基于64字節做應用層協議的。
        2)hid寫速度不能太快,所以我一般在寫前會等待2ms左右,確保不會寫出錯。
        確認是是HIDAPI的代碼問題,我對寫函數修改如下,結果就好了,可以一直寫無需等待
        int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length)
        {
        DWORD bytes_written;
        BOOL res;
        BOOL bResult;
        OVERLAPPED ol;
        HANDLE ReportEvent;
        ReportEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        ResetEvent(ReportEvent);
        memset(&ol, 0, sizeof(ol));
        ol.hEvent = ReportEvent;
        //res = WriteFile(dev->device_handle, data, 23, NULL, &ol);
        res = WriteFile(dev->device_handle, data, length, NULL, &ol);
        if (!res) {
        int errcode = GetLastError();
        if (errcode != ERROR_IO_PENDING) {
        // WriteFile() failed. Return error.
        register_error(dev, "WriteFile");
        return -1;
        }
        }
        bResult = WaitForSingleObject(ReportEvent, 50);
        if(bResult == WAIT_TIMEOUT || bResult == WAIT_ABANDONED)
        {
        register_error(dev, "WriteFile");
        CancelIo(&(dev->device_handle));
        return -1;
        }
        // Wait here until the write is done. This makes
        // hid_write() synchronous.
        res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE);
        if (!res) {
        // The Write operation failed.
        register_error(dev, "WriteFile");
        return -1;
        }
        return bytes_written;
        }
        3)上位機上的讀寫之間不能釋放hid的句柄,這個我參考百合的hid教材的時候,吃了不少苦頭。
        4)我使用了HIDAPI這個庫來操作hid設備。
        具體細節的東西大家可以看看網上找到的hid教程,我的代碼和可執行代碼下載鏈接如下
        http://pan.baidu.com/s/1qzTJw
        注意:上面鏈接中的寫函數我沒有修正,請讀者自己修改


        關鍵詞: stm32HI

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长治县| 河津市| 钟山县| 兰考县| 大渡口区| 临朐县| 县级市| 琼海市| 翼城县| 托克托县| 长沙县| 晋州市| 海城市| 丰城市| 浦江县| 台山市| 定安县| 临朐县| 武川县| 永登县| 武宣县| 松江区| 西盟| 正蓝旗| 伊宁县| 潜江市| 卓资县| 陕西省| 淳安县| 正宁县| 抚顺市| 张家界市| 肇东市| 海南省| 兴义市| 靖州| 无极县| 三河市| 桦南县| 旌德县| 郎溪县|