關於HID裝置開啟並讀寫 |
答題得分者是:taishyang
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
請各位高手幫我看一下是否有錯誤
目前可以將HID DEVICE 利用CREATEFILE的方式開啟 IN OUT Address也有抓取到 但是卻無法讀寫 請問大概是何原因呢? [code cpp] //////////////////////////////////////////////////////////// // CheckHidDevice() // 檢查是否有與VID,PID符合的HID 裝置 //////////////////////////////////////////////////////////// bool TLed_HID::CheckHidDevice() { DWORD dwIndex; GUID guid; HidD_GetHidGuid(&guid); // 取得所有連結的HID Device interface HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if(hDeviceInfo==INVALID_HANDLE_VALUE) return FALSE; // 逐一比對HID裝置的VID & PID dwIndex = 0; for(dwIndex=0; dwIndex<20; dwIndex ) { m_hHidOut = GetDeviceHandle(guid, hDeviceInfo, dwIndex,FALSE); if(m_hHidOut!=INVALID_HANDLE_VALUE) { HIDD_ATTRIBUTES att; // 取得HID attribute. if(HidD_GetAttributes(m_hHidOut, &att)) { // 比對VID & PID if(att.VendorID == m_nVid && att.ProductID == m_nPid) { AnsiString strTitle; strTitle.printf("Hid Led tester : Vid:0xX Pid:0xX" ,att.VendorID,att.ProductID); Led_HID->Caption = strTitle; // 取得in 方向的HANDLE m_hHidIn = GetDeviceHandle(guid, hDeviceInfo, dwIndex,TRUE); return TRUE; } else { CloseHandle(m_hHidOut); m_hHidOut = NULL; } } } } return FALSE; } /////////////////////////////////////////////////////////////////////// // GetDeviceHandle(GUID guid, HANDLE hDev, DWORD wDevice, BOOL bIn) // 取得欲連結裝置的HANDLE // bIn: 傳輸方向, 如果bIn為真則為從HID ==> PC /////////////////////////////////////////////////////////////////////// HANDLE TLed_HID::GetDeviceHandle(GUID guid, HANDLE hDev, DWORD dwDevice, BOOL bIn) { SP_DEVICE_INTERFACE_DATA interfaceDev; interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); //Get interface DWORD dwSize = 0; if(!SetupDiEnumDeviceInterfaces(hDev, NULL, &guid, dwDevice, &interfaceDev)|| SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, NULL, 0, &dwSize, NULL)) return INVALID_HANDLE_VALUE; //Create buffer SP_INTERFACE_DEVICE_DETAIL_DATA *pDeviceDetail; pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(dwSize); pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, pDeviceDetail, dwSize, &dwSize, NULL)) { free(pDeviceDetail); return INVALID_HANDLE_VALUE; } //Get device handle HANDLE hDevice; if(bIn) { hDevice = CreateFile(pDeviceDetail->DevicePath, GENERIC_READ, // read // Device ==> PC FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); } else { hDevice = CreateFile(pDeviceDetail->DevicePath, GENERIC_WRITE, // write // PC ==> Device FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); } free(pDeviceDetail); return hDevice; } //////////////////////////////////////////////////////////// //將資料放入Buffer利用writefile(),寫入USB Device //////////////////////////////////////////////////////////// bool TLed_HID::SetReport() { bool bResult = TRUE; BYTE byBuf[8]; unsigned long ulBytes = 0; // we write 2 bytes to output pipe // the first byte(byBuf[0]) is the report id // byBuf[1] is the Led data byBuf[0] = 0; // report ID; byBuf[1] = m_byLedData; bResult=WriteFile(m_hHidOut,byBuf,2, &ulBytes,NULL); return bResult; } //////////////////////////////////////////////////////////// //利用Readfile(),收取USB Device回傳資料 //////////////////////////////////////////////////////////// bool TLed_HID::GetReport() { bool bResult = TRUE; BYTE byBufIn[8]; unsigned long ulBytes = 0; // we read 3 bytes from input pipe // the first byte(byBufIn[0]) is the report id // byBufIn[1] is the button data hi byte // byBufIn[2] is the button data lo byte // we only use the hi byte for AD. bResult=ReadFile(m_hHidIn,byBufIn,8,&ulBytes,NULL); if(bResult) { m_byData1 = byBufIn[1]; m_byData2 = byBufIn[2]; } return bResult; } [/code] |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
HIDD_ATTRIBUTES att;
PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)){ if (att.VendorID == m_nVid && att.ProductID == m_nPid){ m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何 |
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
感謝~~
===================引 用 lkap 文 章=================== 已把網址發到你MAIL ===================引 用 vk8051 文 章=================== 大大: 請問可以給我這USB HID的程式CODE嗎? 因為我也在研究USB HID的部份,但是才剛開始研究一點都不會,所以可以斗敢要這部份的CODE嗎? USB HID的開埠和讀寫的部份!! 感恩呀~ ===================引 用 lkap 文 章=================== 感謝副站長的指導 Firmware 傳出九個 所以我修正了陣列大小就可以了
------
vincent |
boss.tw
高階會員 發表:15 回覆:109 積分:194 註冊:2005-05-17 發送簡訊給我 |
小弟能否也要一下這部份的資料
===================引 用 lkap 文 章=================== 已把網址發到你MAIL ===================引 用 vk8051 文 章=================== 大大: 請問可以給我這USB HID的程式CODE嗎? 因為我也在研究USB HID的部份,但是才剛開始研究一點都不會,所以可以斗敢要這部份的CODE嗎? USB HID的開埠和讀寫的部份!! 感恩呀~ ===================引 用 lkap 文 章=================== 感謝副站長的指導 Firmware 傳出九個 所以我修正了陣列大小就可以了 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
都已發至信箱 可以参考該網頁的BCB程式 也有文件說明
===================引 用 GrandRURU 文 章=================== 可否再分享一下呢? 1 ===================引 用 boss.tw 文 章=================== 小弟能否也要一下這部份的資料 ===================引 用 lkap 文 章=================== 已把網址發到你MAIL ===================引 用 vk8051 文 章=================== 大大: 請問可以給我這USB HID的程式CODE嗎? 因為我也在研究USB HID的部份,但是才剛開始研究一點都不會,所以可以斗敢要這部份的CODE嗎? USB HID的開埠和讀寫的部份!! 感恩呀~ |
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
請問前輩,我在上面的程式中找不到現在這段的部份,請問這段跟最上面的部份是同一個程式嗎?
===================引 用 taishyang 文 章=================== HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)){ if (att.VendorID == m_nVid && att.ProductID == m_nPid){ m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何
------
vincent |
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
我沒看到你那部份的程式
===================引 用 vk8051 文 章=================== 請問前輩,我在上面的程式中找不到現在這段的部份,請問這段跟最上面的部份是同一個程式嗎? ===================引 用 taishyang 文 章=================== HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)){ if (att.VendorID == m_nVid && att.ProductID == m_nPid){ m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何 |
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
//---------------------------------------------------------------------------
#include #pragma hdrstop #include #include #include #include extern "C" { #include "hid_ddk_inc\hidsdi.h" } #include #include "main.h" //#include "THidthread.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TLed_HID *Led_HID; //--------------------------------------------------------------------------- __fastcall TLed_HID::TLed_HID(TComponent* Owner) : TForm(Owner) { m_bGetDevice = FALSE; } //--------------------------------------------------------------------------- void __fastcall TLed_HID::BtnGetDeviceClick(TObject *Sender) { AnsiString strTitle; m_nVid = EditVid->Text.ToInt(); m_nPid = EditPid->Text.ToInt(); // If not get device yet! Try to connect it. if( !m_bGetDevice ) { if( !m_nVid || !m_nPid) { ShowMessage("Invalid Vid or Pid!"); return; } m_bGetDevice = CheckHidDevice(); if( m_bGetDevice == 0) { ShowMessage("No device find!"); return; } } if(!m_bRunning) { strTitle = "Stop" ; BtnGetDevice->Caption = strTitle; m_bRunning = TRUE; } else { strTitle = "Start" ; BtnGetDevice->Caption = strTitle; m_bRunning = FALSE; } } //////////////////////////////////////////////////////////// // CheckHidDevice() // 檢查是否有與VID,PID符合的HID 裝置 //////////////////////////////////////////////////////////// bool TLed_HID::CheckHidDevice() { DWORD dwIndex; GUID guid; HidD_GetHidGuid(&guid); // 取得所有連結的HID Device interface HDEVINFO hDeviceInfo = SetupDiGetClassDevs(&guid, NULL, NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if(hDeviceInfo==INVALID_HANDLE_VALUE) return FALSE; // 逐一比對HID裝置的VID & PID dwIndex = 0; for(dwIndex=0; dwIndex<20; dwIndex ) { m_hHidOut = GetDeviceHandle(guid, hDeviceInfo, dwIndex,FALSE); if(m_hHidOut!=INVALID_HANDLE_VALUE) { HIDD_ATTRIBUTES att; // 取得HID attribute. if(HidD_GetAttributes(m_hHidOut, &att)) { // 比對VID & PID if(att.VendorID == m_nVid && att.ProductID == m_nPid) { AnsiString strTitle; strTitle.printf("Hid Led tester : Vid:0xX Pid:0xX",att.VendorID,att.ProductID); Led_HID->Caption = strTitle; // 取得in 方向的HANDLE m_hHidIn = GetDeviceHandle(guid, hDeviceInfo, dwIndex,TRUE); return TRUE; } else { CloseHandle(m_hHidOut); m_hHidOut = NULL; } } } } return FALSE; } /////////////////////////////////////////////////////////////////////// // GetDeviceHandle(GUID guid, HANDLE hDev, DWORD wDevice, BOOL bIn) // 取得欲連結裝置的HANDLE // bIn: 傳輸方向, 如果bIn為真則為從HID ==> PC /////////////////////////////////////////////////////////////////////// HANDLE TLed_HID::GetDeviceHandle(GUID guid, HANDLE hDev, DWORD dwDevice, BOOL bIn) { SP_DEVICE_INTERFACE_DATA interfaceDev; interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); //Get interface DWORD dwSize = 0; if(!SetupDiEnumDeviceInterfaces(hDev, NULL, &guid, dwDevice, &interfaceDev)|| SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, NULL, 0, &dwSize, NULL)) return INVALID_HANDLE_VALUE; //Create buffer SP_INTERFACE_DEVICE_DETAIL_DATA *pDeviceDetail; pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(dwSize); pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); if(!SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, pDeviceDetail, dwSize, &dwSize, NULL)) { free(pDeviceDetail); return INVALID_HANDLE_VALUE; } //Get device handle HANDLE hDevice; if(bIn) { hDevice = CreateFile(pDeviceDetail->DevicePath, GENERIC_READ, // read // Device ==> PC FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); } else { hDevice = CreateFile(pDeviceDetail->DevicePath, GENERIC_WRITE, // write // PC ==> Device FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); } free(pDeviceDetail); return hDevice; } //--------------------------------------------------------------------------- bool TLed_HID::SetReport() { bool bResult = TRUE; BYTE byBuf[8]; unsigned long ulBytes = 0; // we write 2 bytes to output pipe // the first byte(byBuf[0]) is the report id // byBuf[1] is the Led data byBuf[0] = 0; // report ID; byBuf[1] = m_byLedData; bResult=WriteFile(m_hHidOut,byBuf,2, &ulBytes,NULL); return bResult; } //--------------------------------------------------------------------------- bool TLed_HID::GetReport() { bool bResult = TRUE; BYTE byBufIn[8]; unsigned long ulBytes = 0; // we read 3 bytes from input pipe // the first byte(byBufIn[0]) is the report id // byBufIn[1] is the button data hi byte // byBufIn[2] is the button data lo byte // we only use the hi byte for AD. bResult=ReadFile(m_hHidIn,byBufIn,3, &ulBytes,NULL); if(bResult) { m_byData1 = byBufIn[1]; m_byData2 = byBufIn[2]; } return bResult; } //--------------------------------------------------------------------------- void __fastcall TLed_HID::Button1Click(TObject *Sender) { AnsiString buff; unsigned long i; bool bResult = TRUE; BYTE byBufIn[32]; unsigned long ulBytes = 32; //------------------------------------------------------- bResult=ReadFile(m_hHidIn,byBufIn,32, &ulBytes,NULL); if( bResult ) { for( i=0; i<32; i ) { buff = buff (IntToHex(byBufIn[i], 2) ','); }//for_i Memo1->Lines->Add(buff);//在memo元件上顯示收到的碼 } } //--------------------------------------------------------------------------- 這是我刪除其他LED的部份剩下的程式,然後輸入PID/VID可以抓到滑鼠,但是我用了一個按鈕手動來收USB滑鼠的資料但是一直是00,00 所以可以再麻煩一下指導我一下~是那邊不對嗎 謝謝 ===================引 用 lkap 文 章=================== 我沒看到你那部份的程式 ===================引 用 vk8051 文 章=================== 請問前輩,我在上面的程式中找不到現在這段的部份,請問這段跟最上面的部份是同一個程式嗎? ===================引 用 taishyang 文 章=================== HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)){ if (att.VendorID == m_nVid && att.ProductID == m_nPid){ m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何
------
vincent |
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
那請問~
這段範例程式中那邊有出現這段程式~ HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)) { if (att.VendorID == m_nVid && att.ProductID == m_nPid) { m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何 因為我看不到這一段可以調整資料長度的部份!! ===================引 用 lkap 文 章=================== 我是抓取自己Firmware送出來的資料,沒抓取過MOUSE的資料 所以我也不曉得
------
vincent |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
自己加上去不就行了^^?
只是檢查長度(因為韌體端已經固定長度了),並不是調整 那段程式只是要確定韌體端EP的資料長度為何 用於之後Read/WriteFile的參數 ===================引 用 vk8051 文 章=================== 那請問~ 這段範例程式中那邊有出現這段程式~ HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)) { if (att.VendorID == m_nVid && att.ProductID == m_nPid) { m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何 因為我看不到這一段可以調整資料長度的部份!! |
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
收到~
那我加上試試~ 如果我都固定傳36個byte,是不是在real跟write那個涵式直接填上這個固定的長度就可以? 因為我是完全不了解USB,麻煩在指導一下!! 感恩~ ===================引 用 taishyang 文 章=================== 自己加上去不就行了^^? 只是檢查長度(因為韌體端已經固定長度了),並不是調整 那段程式只是要確定韌體端EP的資料長度為何 用於之後Read/WriteFile的參數 ===================引 用 vk8051 文 章=================== 那請問~ 這段範例程式中那邊有出現這段程式~ HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; if (HidD_GetAttributes(m_hHidOut, &att)) { if (att.VendorID == m_nVid && att.ProductID == m_nPid) { m_hHidIn = _getDeviceHandle(guid, hDeviceInfo, dwIndex, TRUE); if (HidD_GetPreparsedData(m_hHidOut, &pPreData)){ if (HidP_GetCaps(pPreData, & cap ) == HIDP_STATUS_SUCCESS){ m_nInReportSize = cap.InputReportByteLength; <-- check這裡的長度為何 因為我看不到這一段可以調整資料長度的部份!!
------
vincent |
haaaaa
一般會員 發表:0 回覆:1 積分:0 註冊:2003-06-06 發送簡訊給我 |
|
kyp001
一般會員 發表:0 回覆:1 積分:0 註冊:2011-01-13 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
salo0610
高階會員 發表:42 回覆:120 積分:107 註冊:2003-02-18 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
iandergan
一般會員 發表:0 回覆:1 積分:0 註冊:2011-07-18 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
ANDY8C
資深會員 發表:114 回覆:582 積分:299 註冊:2006-10-29 發送簡訊給我 |
|
lkap
一般會員 發表:2 回覆:21 積分:4 註冊:2005-10-03 發送簡訊給我 |
|
marky1
一般會員 發表:17 回覆:29 積分:9 註冊:2003-03-19 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |