<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

完成stm32 上HID的應用

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò ) 收藏
這個(gè)是公司的項目,以前基于usb的虛擬串口來(lái)做上下位機通信,由于usb平時(shí)也就刷參數和調試之用,也不很常用,外面反應usb有時(shí)會(huì )連不上stm32控制器,心里一直認為不是大問(wèn)題,后來(lái)反應的多了,就重視這個(gè)事情了,雖然usb平時(shí)不用,但是用的時(shí)候只要出現異常掉線(xiàn),就再也連不上去了,特別影響用戶(hù)對我們產(chǎn)品的信心。
在網(wǎng)上找了很多資料,到現在也只能隱約確定是stm32官方的虛擬串口庫有問(wèn)題,我發(fā)現不同的電源板都會(huì )影響到usb虛擬串口的枚舉,于是下定決心使用其他方式來(lái)做上下位機的連接,排除了usb虛擬串口,眼前的選擇只有兩個(gè)
1)usblib,這個(gè)是針對usb的上位機庫,可以玩很多的花樣,但是需要開(kāi)發(fā)者稍稍熟悉usb協(xié)議,而且這個(gè)需要在上位機上安裝usb驅動(dòng)程序。
2)hid設備,這個(gè)是windows自身支持的usb設備,只支持中斷傳輸,最大的速率也就64Kb/s,上位機采用windows api編程
我估算了一下,hid方式滿(mǎn)足我的要求,而且是免驅動(dòng),又不用學(xué)習usblib,所以就使用hid方式實(shí)現了usb通信。
hid幾個(gè)注意事項:
1)對于windows API來(lái)說(shuō),讀和寫(xiě)hid設備的數據包都是大小確定了,也就是說(shuō)如果stm32 端口設備的hid屬性是64的話(huà),那么讀寫(xiě)都是64字節的。讀寫(xiě)的最大幀是64字節,我在代碼中是基于64字節做應用層協(xié)議的。
2)hid寫(xiě)速度不能太快,所以我一般在寫(xiě)前會(huì )等待2ms左右,確保不會(huì )寫(xiě)出錯。
確認是是HIDAPI的代碼問(wèn)題,我對寫(xiě)函數修改如下,結果就好了,可以一直寫(xiě)無(wú)需等待
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)上位機上的讀寫(xiě)之間不能釋放hid的句柄,這個(gè)我參考百合的hid教材的時(shí)候,吃了不少苦頭。
4)我使用了HIDAPI這個(gè)庫來(lái)操作hid設備。
具體細節的東西大家可以看看網(wǎng)上找到的hid教程,我的代碼和可執行代碼下載鏈接如下
http://pan.baidu.com/s/1qzTJw
注意:上面鏈接中的寫(xiě)函數我沒(méi)有修正,請讀者自己修改


關(guān)鍵詞: stm32HI

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>