tag:blogger.com,1999:blog-8273926976116880385.post8088300779099849545..comments2023-10-10T21:43:59.868+08:00Comments on 猛哥的軌跡: 簡單講講 USB Human Interface Devicewafthttp://www.blogger.com/profile/05053941101229353830noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-8273926976116880385.post-11484716934768870632017-03-13T15:01:00.786+08:002017-03-13T15:01:00.786+08:00請問~ 針對不同的endpoint該如何對hid下指令?
如:endpoint 4 USB pro...請問~ 針對不同的endpoint該如何對hid下指令?<br />如:endpoint 4 USB properties https://gyazo.com/bc23eec4683c91c93cbc7dbf0773b857Anonymoushttps://www.blogger.com/profile/13518686757980762105noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-34496545838858760142015-04-16T15:34:32.541+08:002015-04-16T15:34:32.541+08:00了解,謝謝您的指教!了解,謝謝您的指教!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-74734588946634583822015-04-15T13:48:30.138+08:002015-04-15T13:48:30.138+08:00當然是 64 因為您已經要求 ReadFile
緩衝區要塞滿 64 的 byte 阿
Windo...當然是 64 因為您已經要求 ReadFile<br />緩衝區要塞滿 64 的 byte 阿<br /><br />Windows 應用層不會去管設備端的韌體怎麼寫<br />應用端設定的 Buffer 大小跟 USB 設備韌體無關<br /><br />並不是說用了 USB 就可以避開像 RS232 通訊 要收一堆<br />然後掃描 Buffer 看看裡面有沒有對的 Pattern<br /><br />敝人自己做 USB Bulk IO 也是 Buffer 要設大 多收幾筆 <br />掃描 Pattern ,敝人通常 PC 端 USB Data Buffer <br />會設定的比 韌體準備要傳過來的大 2 倍<br /><br />您用 TCP/IP 網路的話也是一樣 Pattern 掃描基本上都要<br /><br />因為這類的協定是 無邊界型式 並非像 CAN Bus 可以很準確<br />兩邊設定 8 個 Byte 就是收 8 Byte CAN Bus 是 訊息邊界型式的協定<br /><br />USB 只有 Control 是 訊息管道 可以像 CANBus 一樣精準收發 <br />不用做 Pattern 掃描,其它的 串流管道 就沒有訊息邊界囉<br /><br />這就是敝人用 HID 喜歡用 Feature Report ,要用 IN OUT 我會<br />直接走 Bulk<br /><br />... 參考看看 ~~~UBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-37249496028480652192015-04-15T13:24:07.288+08:002015-04-15T13:24:07.288+08:00不能直接控制,因為 蜂鳴器屬於 傳統 IO Port 的設備
當然你可以設計一個 USB HID 設...不能直接控制,因為 蜂鳴器屬於 傳統 IO Port 的設備<br />當然你可以設計一個 USB HID 設備並且寫支應用程式搭配<br />讓應用程式去呼叫 Beep 這個 Windows API<br /><br />應用程式可以寫成服務型應用程式也就是進入點是 ServiceMain<br /><br />另外一種做法比較難但是比較直接<br />寫驅動程式,因為驅動程式在 Ring0 裡面 為你的HID設備寫一支<br />HID 過濾驅動 攔截 自己HID設備發來的指令 直接用 IO 指令 控制<br />8253 讓 蜂鳴器發聲<br />... 參考看看UBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-23734591335005627532015-04-14T16:31:59.204+08:002015-04-14T16:31:59.204+08:00想請問一下,用USB HID有辦直接控制電腦內鍵的蜂鳴器讓它響嗎?想請問一下,用USB HID有辦直接控制電腦內鍵的蜂鳴器讓它響嗎?Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-29522996056964820902015-03-20T17:17:41.348+08:002015-03-20T17:17:41.348+08:00我做了一個 USB HID DEVICE, HID report as follows:
Usa...我做了一個 USB HID DEVICE, HID report as follows:<br /> <br />Usage Page (Vendor-Defined 1) 06 00 FF <br />Usage (Vendor-Defined 2) 09 02 <br />Collection (Application) A1 01 <br />Logical Minimum (0) 15 00 <br />Logical Maximum (255) 26 FF 00 <br />Report Size (8) 75 08 <br />Report ID (1) 85 01 <br />Report Count (7) 95 07 <br />Usage (Vendor-Defined 2) 09 02 <br />Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 <br />Usage (Vendor-Defined 2) 09 02 <br />Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02 <br />Report ID (2) 85 02 <br />Report Count (63) 95 3F <br />Usage (Vendor-Defined 2) 09 02 <br />Input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) 81 02 <br />Usage (Vendor-Defined 2) 09 02 <br />Output (Data,Var,Abs,NWrp,Lin,Pref,NNul,NVol,Bit) 91 02 <br />End Collection C0 <br />USB HID device success send 8 bytes data to pc. (01 35 00 00 00 00 00 00)<br /> <br />HidP_GetCaps(pPreData, &cap) get cap.InputReportByteLength = 64<br />Part of the C++ source code:<br /> <br />{<br />memset(ReadReportBuffer, 0, sizeof(ReadReportBuffer));<br />ReadFile(m_hReadHandle,<br />ReadReportBuffer,<br />64, <br />NULL,<br />&ReadOverlapped);<br />}<br />dObject = WaitForMultipleObjects(2, hArray, FALSE, INFINITE);<br />if (dObject == WAIT_OBJECT_0)<br />{<br />if (!MyDevFound)//Device extract also set the event <br />{<br />continue;<br />}<br />GetOverlappedResult(m_hReadHandle,<br />&ReadOverlapped,<br />&nBytesRead,<br />TRUE);//you can also set the last parameter False<br />if (nBytesRead != 0)<br />{<br />m_strTemp = ReadReportBuffer;<br />m_strLog.Format(_T("Read the Report Data Length is %d.(%02d:%02d:%02d)"),<br />nBytesRead, sysTime.wHour, sysTime.wMinute, sysTime.wSecond);<br />m_strLog += m_strTemp;<br />Display_Info::SendEvent(m_strLog);<br />//Display Receive Data<br />pDlg->DisplayDataHex(ReadReportBuffer, nBytesRead);<br />}<br /> <br />why nBytesRead value = 64?<br />讀進來的DATA有包含USB送的8byte DATA.cnirhttps://www.blogger.com/profile/06383264758142467285noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-69381183481039078452013-09-13T16:56:01.219+08:002013-09-13T16:56:01.219+08:00瑞薩 MCU 晶片阿 ; 瑞薩的部分我只用過 H8S 系列
瑞薩的產品蠻不錯學,產品的支援度都很完整...瑞薩 MCU 晶片阿 ; 瑞薩的部分我只用過 H8S 系列<br />瑞薩的產品蠻不錯學,產品的支援度都很完整<br />不過 瑞薩 沒有做 Hi-Speed 以上的周邊控制晶片<br />這點倒是蠻怪的地方,Hi-Speed 以上都只專攻 Host 控制晶片UBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-57618352110265006902013-09-13T16:41:27.944+08:002013-09-13T16:41:27.944+08:00QT 阿; 哈哈 你還是得面對 UI 加油啦~~~~
對 QT 框架不熟悉的話 而且趕時間的話
就...QT 阿; 哈哈 你還是得面對 UI 加油啦~~~~<br />對 QT 框架不熟悉的話 而且趕時間的話<br />就用 Designer ; 我的 QT 都一直用 4.6.3<br />環境是 Qt4 Visual Studio Add-in<br />與 Qt by Nokia 4.6.3 (VS2008 Open Source)<br />現代這種繼承式的物件導向 UI 框架 大概都長得差不多<br />wxWidget MFC QT Win32++ ; GTK 除外 他是 C Interface 型的 UI 框架<br />Win32++ 又被稱為 Mini MFC 是有高手參考 MFC 原始碼 把常用的部分抽出來<br />從新設計的小 MFC<br />Borland 方面就是 VCL OWL 等等 當然還有許多 小公司設計的其他框架<br /><br />要用 Feature Report 就要調出韌體端原始碼修改阿 ; 在 Report Descriptor<br />加入一 Feature Report ; 在韌體端找處理Get Report Request的原始碼 只是把承載的<br />資料換成用 Feature Report 而已 ; 不過等你有自己需要 寫 USB 韌體可以<br />再來討論 ; 你的案子趕的話 當然也是先把案子搞定 ; 我記得我以前在老師<br />的公司上班 案子快來不及了 才說 要加一個 功能可以直接用網路把 資料輸出<br />也是急急忙忙才匆忙找一本 Win32 Socket 翻翻有沒有類似的 sample 先可以<br />work 在說; 其實你有沒有發現 你真的畢業出去了 真的就很難 好好地做下來<br />把一門技術鑽研到精 ; 這就是我以前為何老是逼著你要學一點 ; 你現在 有 Win32<br />的基礎 要學 QT 那是很簡單的事情 用繼承的方式寫 總比寫 Native API 簡單UBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-29629998259553633402013-09-13T09:25:31.095+08:002013-09-13T09:25:31.095+08:00晶片是瑞薩的
uart應該也是他自己內建的晶片是瑞薩的<br />uart應該也是他自己內建的wafthttps://www.blogger.com/profile/05053941101229353830noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-72729436390509393852013-09-13T08:59:10.407+08:002013-09-13T08:59:10.407+08:00我在Waft那邊上班啦,你問他可能比我還清楚XD,不過要用Feature Report的話要怎麼做呀...我在Waft那邊上班啦,你問他可能比我還清楚XD,不過要用Feature Report的話要怎麼做呀?有需要到什麼東西嗎?而我一開始選用ReadFile和WriteFile的原因是因為前人是用這個,所以我也算是半COPY(只是他是用VB來寫),我對通訊這塊還是很陌生呀,所以你跟我說用USB Bulk來做我也不會做...。再說我也沒很多時間研究,感覺我已經快來不及了,我還要用QT去寫UI介面,這邊來動都還沒動QQAnonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-14740260915944661662013-09-12T17:31:26.408+08:002013-09-12T17:31:26.408+08:00喔 你這種是回應式的HID阿
用 Input Report 與 Output Report 控制 ...喔 你這種是回應式的HID阿<br />用 Input Report 與 Output Report 控制 USB HID<br /><br />USB 領域有嚴格定義 總是站在 Host 方向看 <br />Host ----> Device 叫做 OUT<br />Host <---- Device 叫做 IN<br /><br />你只是又掛在 HID 的協定上做<br /><br />0.0 這個其實最原始的做法 就是用真正的 USB Bulk IN/OUT<br />這種彈性大速度快,才能達到接近 1.2 MB/s 的速度 HID 不行<br />不過看你的程式類型 也不像資料擷取卡 好像也不用快<br /><br />所以我才說幹嘛這麼累阿~~~~~~~<br />要先 OUT 然後才 IN 的通訊型<br /><br />要嘛像我在韌體規劃用 Feature Report 就好了<br />因為控制傳輸就有這種效果 不用在那邊 WriteFile ReadFile <br />還要 Overlapped 多麻煩阿~~<br /><br />一個 GetFeature 就搞定了 而且還一樣跟你有 8 byte data 可以用<br /><br />要玩 OUT/IN 直接走原生的 USB Bulk 就好啦<br /><br />你遇到 Win9X 的老系統客戶 不支援 Interrupt Endpoint OUT<br />那不就掰掰了嗎 ? ~~~~~~ 哈哈<br /><br />你是用哪家的晶片阿 阿凱 ?? 這麼神秘 不告訴我 哈哈<br /><br />總之 你要記住 要走 HID 的話 要就是 Input Report <br />你的程式自己 Polling ,要走命令 就用 Feature Report<br /><br />我自己本人寫 HID 也不太用 Interrupt EP OUTUBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-87576350398923930242013-09-12T08:48:54.111+08:002013-09-12T08:48:54.111+08:00其實發現我的CODE應該沒問題,只差在我那台裝置需要先輸入00000004他才會開始輸出資料,之前沒...其實發現我的CODE應該沒問題,只差在我那台裝置需要先輸入00000004他才會開始輸出資料,之前沒讀到資料就是差在這一步。Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-24498098837059886492013-09-11T17:48:17.284+08:002013-09-11T17:48:17.284+08:00終於有東西了....感謝學長!!!
我把程式搞好一點在PO給學長看:)終於有東西了....感謝學長!!!<br />我把程式搞好一點在PO給學長看:)Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-22507264331350167242013-09-11T17:01:17.980+08:002013-09-11T17:01:17.980+08:00哈哈哈,如果沒有學長之前的教導,想必我不能吸收這麼快的啦XD。我這邊再努力看看吧,感覺快出來了!!哈哈哈,如果沒有學長之前的教導,想必我不能吸收這麼快的啦XD。我這邊再努力看看吧,感覺快出來了!!Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-35253355704969594872013-09-11T16:48:32.958+08:002013-09-11T16:48:32.958+08:00還有 我稍微看你的程式 有呼叫 wcstombs
我覺得你現在就要直接開始習慣用 Unicode 程...還有 我稍微看你的程式 有呼叫 wcstombs<br />我覺得你現在就要直接開始習慣用 Unicode 程式<br />就不用老是轉來轉去,Unicode 版本的 printf<br />是 wprintf,字串前面記得加 L, ex: L"我是阿凱"UBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-51618350881184052732013-09-11T16:45:15.848+08:002013-09-11T16:45:15.848+08:00阿凱~~~ 韌體的部分 也有包嗎 ~~~
0.0 HID 跟你使用的描述子有關
是否韌體搭配那邊可能...阿凱~~~ 韌體的部分 也有包嗎 ~~~<br />0.0 HID 跟你使用的描述子有關<br />是否韌體搭配那邊可能有問題呢? 要不要檢查一下<br /><br />我要明天 meeting 完才有空一行一行看你貼的 Code。<br />被凹要做速度曲線追蹤 囧<br /><br />因為 GetFeature 是給 Feature Report 用的 API<br />韌體要有設計才有用 USB 軟韌都要互相搭配才行<br /><br />因為根據你講說 讀取的 HID 設備 Handle 本身有抓到,但是資料老是抓不出來 ~~~<br />檢查一下你的韌體吧 ~~~ 或是說原廠有沒有可以搭配 Work 的 Host 軟體<br />用 USBlyzer 去檢查究竟是怎麼通訊的形式<br /><br />你假如確定韌體真的沒問題,就用我以前教你的老方法,用 Visual Studio<br />開一個簡單的 Console 程式,先加設備列舉的部分,printf 看看有沒有問題<br />ok 了 在加 CreateFile 打開設備的 Code, 最後才用 HID APIs 或 ReadFile WriteFile<br />讀讀看設備,一步一步驗證 你進步得很快阿 不虧是我指定的傳人 哈哈<br /><br />總之 明天 meeting 完 我會仔細看你貼的 CodeUBIWUhttps://www.blogger.com/profile/12866156630814680545noreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-55828415746824055382013-09-11T14:48:41.894+08:002013-09-11T14:48:41.894+08:00HANDLE Get_InterfaceHandle( GUID vGuid, DWORD wDev...HANDLE Get_InterfaceHandle( GUID vGuid, DWORD wDevice)<br />{<br /> SP_DEVICE_INTERFACE_DATA interfaceDev; //裝置資訊 2<br /> interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);<br /> DWORD wSize = 0;<br /> HANDLE hDev = NULL;<br /> <br />// SP_INTERFACE_DEVICE_DETAIL_DATA *pDeviceDetail; //路徑 3、4<br />// pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(wSize);<br />// pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);<br /><br />/////////////////////////////////// 1 //////////////////////////////////////////<br /> HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&vGuid, NULL, NULL, <br /> DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);<br /><br /> if(hDeviceInfo == INVALID_HANDLE_VALUE)<br /> { <br /> printf("No [Device Information Set] available for this GUID!\n");<br /> return hDev;<br /> }<br />///////////////////////////////// 2、3 //////////////////////////////////////////<br /> if(!SetupDiEnumDeviceInterfaces(hDeviceInfo, NULL, &vGuid, wDevice, &interfaceDev))<br /> {<br /> printf("No more interface available for this GUID!\n");<br /> SetupDiDestroyDeviceInfoList( hDeviceInfo);<br /> return hDev;<br /> }<br /> SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &interfaceDev, NULL, 0, &wSize, NULL);<br /> <br /> PSP_DEVICE_INTERFACE_DETAIL_DATA pifPath = <br /> (PSP_DEVICE_INTERFACE_DETAIL_DATA) (new char[wSize]);<br /> pifPath->cbSize = sizeof( SP_DEVICE_INTERFACE_DETAIL_DATA);<br />// printf("pifPath->cbSize: %d\n", pifPath->cbSize);<br />/////////////////////////////////// 4 //////////////////////////////////////////<br /> if(!SetupDiGetDeviceInterfaceDetail(hDeviceInfo, &interfaceDev, pifPath, wSize, &wSize, NULL))<br /> {<br /> free(pifPath);<br /> return hDev;<br /> }<br /> <br />// printf("Path of the interface Object is %s\n",pifPath->DevicePath);<br />/////////////////////////////////// 5 //////////////////////////////////////////<br /> hDev = CreateFile(pifPath->DevicePath, GENERIC_READ,<br /> FILE_SHARE_READ, NULL, OPEN_EXISTING,<br /> FILE_FLAG_OVERLAPPED, NULL);<br /><br />// if ( hDev == INVALID_HANDLE_VALUE)<br />// {<br />// printf("CreateFile open error!\n");<br />// }<br /><br />////////////////////////////////////////////////////////////////////////////////////////<br /><br /> free(pifPath);<br /> SetupDiDestroyDeviceInfoList( hDeviceInfo);<br /> return hDev;<br /><br />}Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-26032056146909497362013-09-11T14:48:04.789+08:002013-09-11T14:48:04.789+08:00while(1)
{
myDevice.hDev = Get_InterfaceHandle(... while(1)<br /> {<br /> myDevice.hDev = Get_InterfaceHandle( guid, wDevice++);<br /> if ( myDevice.hDev == NULL)<br /> return 0;<br /> <br /> if (myDevice.hDev == INVALID_HANDLE_VALUE)<br /> {<br /> printf("Found the %dth HID interface\n", wDevice);<br /> printf("CreateFile open error!\n\n"); <br /> }<br /> else<br /> {<br /> printf("Found the %dth HID interface\n", wDevice);<br /> if(HidD_GetAttributes(myDevice.hDev, &att))<br /> {<br /> if(HidD_GetPreparsedData(myDevice.hDev, &pPreData))<br /> { <br /> if(HidP_GetCaps(pPreData, &cap)==HIDP_STATUS_SUCCESS)<br /> {<br /> if ( HidD_GetManufacturerString( myDevice.hDev, mString, sizeof(mString)) )<br /> {<br /> if (wcstombs(ch_buffer, mString, 256) == -1) // -1 = conversion failure<br /> ch_buffer[0] =blank[0];<br /> printf("XXX Manufacturer: %s\n",ch_buffer);<br /> }<br /><br /> if ( HidD_GetProductString( myDevice.hDev, mString, sizeof(mString)) )<br /> {<br /> if (wcstombs(ch_buffer, mString, 256) == -1) // -1 = conversion failure<br /> ch_buffer[0] =blank[0];<br /> printf("XXX Product: %s\n",ch_buffer);<br /> }<br /><br /> if ( HidD_GetSerialNumberString( myDevice.hDev, mString, sizeof(mString)) )<br /> {<br /> if (wcstombs(ch_buffer, mString, 256) == -1) // -1 = conversion failure<br /> ch_buffer[0] =blank[0];<br /> printf("XXX Serial Number: %s\n",ch_buffer);<br /> }<br /> printf("VendorID: %x ProductID: %x VersionNumber: %x\n",att.VendorID,att.ProductID,att.VendorID);<br /> printf("Top level Usage page %xh, usage %xh\n", cap.UsagePage, cap.Usage);<br /> printf("InputReportByteLength %d\n", cap.InputReportByteLength);<br /> printf("OutputReportByteLength %d\n", cap.OutputReportByteLength);<br /> printf("FeatureReportByteLength %d\n\n", cap.FeatureReportByteLength);<br /><br /> if(att.VendorID==para[0] && att.ProductID==para[1] && att.VersionNumber==para[2] && cap.UsagePage==para[3] && cap.Usage==para[4])<br /> {<br /> ReadFile(myDevice.hDev, myDevice.cBuf, cap.InputReportByteLength , &wByteRead, &ol);<br /> wResult = WaitForSingleObject(ol.hEvent, 10000);<br /><br /> switch(wResult)<br /> {<br /> case WAIT_OBJECT_0: {<br /> // Success;<br /> // Use the report data;<br /> break;<br /> }<br /> case WAIT_TIMEOUT: {<br /> // Timeout error;<br /> //Cancel the read operation.<br /> CancelIo(myDevice.hDev);<br /> break;<br /> }<br /> default: {<br /> // Undefined error;<br /> //Cancel the read operation.<br /> CancelIo(myDevice.hDev);<br /> break;<br /> }<br /> }<br /><br /><br /> printf(" wByteRead: %d\n\n", wByteRead);<br /> <br /> // if(!HidD_GetInputReport(myDevice.hDev, myDevice.cBuf, 2))//cap.FeatureReportByteLength))<br /> if(!HidD_GetFeature(myDevice.hDev, myDevice.cBuf, 2))//cap.FeatureReportByteLength))<br /> break;<br /> else<br /> {<br /> <br /> printf(" Input report ID: %d\n\n", myDevice.cBuf[0]);<br /> <br /> if (wByteRead >= 1)<br /> {<br /> printf("***************************************\n");<br /> printf(" read success\n");<br /> printf("***************************************\n\n");<br /> printf(" Input report 1st byte: %x\n", myDevice.cBuf[1]);<br /> }<br /> if (wByteRead >= 2)<br /> printf(" Input report 2st byte: %x\n", myDevice.cBuf[2]);<br /><br /> }<br /> }<br /> /* if(att.VendorID==0x056D && att.ProductID==0x0002 && att.VersionNumber==0x7530)<br /> {<br /> if(cap.Usage==0x01 && cap.UsagePage==0x80)<br /> {<br /> HidD_FreePreparsedData(pPreData);<br /> break;<br /> }<br /> }*/<br /><br /><br /> }<br /> HidD_FreePreparsedData(pPreData);<br /> }<br /> }<br /> else<br /> {<br /> printf("Could not get HID attributes.\n");<br /> printf("It may be a MOUSE or a KEYBOARD!\n\n");<br /> }<br /> }<br /><br />// CloseHandle(myDevice.hDev);<br />// myDevice.hDev = INVALID_HANDLE_VALUE;<br /><br /> CloseHandle( myDevice.hDev);<br /> }<br /><br /> return 0;<br />}Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-8273926976116880385.post-36794330824876339432013-09-11T14:47:29.793+08:002013-09-11T14:47:29.793+08:00這是我參考學長的程式後,再重新寫一次的程式,但是還是不能讀取呀!!!我有試過HidD_GetFeat...這是我參考學長的程式後,再重新寫一次的程式,但是還是不能讀取呀!!!我有試過HidD_GetFeature但還是不行,我到底什麼地方錯了......QQ<br /><br /><br />#include <br />#include <br />#include <br />#include <br /><br />extern "C"<br />{<br /> #include "C:\h\hidsdi.h"<br /> #include <br />}<br />#pragma comment(lib, "hid")<br />#pragma comment(lib, "setupapi")<br />#pragma comment(lib, "kernel32.lib")<br /><br />#include "stdafx.h"<br />#include <br /><br />HANDLE Get_InterfaceHandle( GUID vGuid, DWORD instance);<br /><br />struct MyDevice<br />{<br /> HWND hWnd;<br /> HANDLE hDev;<br /> HANDLE hReadFinished;<br /> char cBuf[9];<br />};<br /><br /><br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> USHORT para[5];<br /><br />// para[0] = 0X1BCF;<br />// para[1] = 0X0007;<br />// para[2] = 0X0014;<br />// para[3] = 0XF1F3;<br />// para[4] = 0XF1F3;<br /><br /> para[0] = 0X144F;<br /> para[1] = 0X7500;<br /> para[2] = 0X0099;<br /> para[3] = 0XFF00;<br /> para[4] = 0X0001;<br /><br /> MyDevice myDevice;<br /> myDevice.hDev=NULL;<br /> myDevice.hReadFinished=NULL;<br /> myDevice.hWnd=NULL;<br /> myDevice.cBuf[0] = 0;<br /> myDevice.cBuf[1] = 0;<br /> myDevice.cBuf[2] = 0;<br /> myDevice.cBuf[3] = 0;<br /> myDevice.cBuf[4] = 0;<br /> myDevice.cBuf[5] = 0;<br /> myDevice.cBuf[6] = 0;<br /> myDevice.cBuf[7] = 0;<br /> myDevice.cBuf[8] = 0;<br /><br /><br /> GUID guid; //裝置<br /> DWORD wDevice = 0; //計數裝置<br /> HIDD_ATTRIBUTES att; //獲得PID、VID和版本<br /><br /><br /> HidD_GetHidGuid(&guid);<br /> PHIDP_PREPARSED_DATA pPreData;<br /> HIDP_CAPS cap;<br /><br /> wchar_t mString[256]; //為了顯示裝置的製造商、產品和SerialNumber資訊 <br /> char ch_buffer[256]; //為了顯示裝置的製造商、產品和SerialNumber資訊<br /> char blank[1]=""; //為了顯示裝置的製造商、產品和SerialNumber資訊<br /><br /> DWORD wByteRead =0,wResult = 0; //讀值<br />// ResetEvent(myDevice.hReadFinished);<br /><br /> OVERLAPPED ol;<br />// ol.hEvent = myDevice.hReadFinished;<br /> ol.Offset = 0;<br /> ol.OffsetHigh = 0;<br /><br /> ol.hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);Anonymousnoreply@blogger.com