再請教USB HID的問題 |
答題得分者是:HUNK999
|
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
我已經把站上的範例整理一次了,測試也OK只是現在ARM7的範例只傳2個BYTES,但是已經能夠通訊了,但是我發現到一個問題如下!!
// 檢查是否有與VID,PID符合的HID 裝置 bool TLed_HID::CheckHidDevice() { GUID guid; HDEVINFO hDeviceInfo; HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; //------------------------------------------------------------------------ HidD_GetHidGuid(&guid);//先取得HID的GUID值 //------------------------------------------------------------------------ // 取得所有連結的HID Device interface hDeviceInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if( hDeviceInfo==INVALID_HANDLE_VALUE ) return FALSE; //------------------------------------------------------------------------ for( int UsbIndex=0; UsbIndex<50; UsbIndex )//逐一比對HID裝置的VID & PID~ { m_hHidOut = GetDeviceHandle(guid,hDeviceInfo,UsbIndex);//取得OUT的HANDLE<-----問題1:這邊我取得m_hHidOut的HANDLE並帶入write的涵式使用ok,但如果帶到read的涵式就會當機,原因為何,因為我看下面又讀了一次HANDLE值然後放到m_hHidIn帶入read涵式,請求這2個HANDLE不能共用一個HANDLE就好了嗎? if(m_hHidOut!=INVALID_HANDLE_VALUE ) { if(HidD_GetAttributes(m_hHidOut,&att))//取得HID attribute~ { if((att.VendorID==MyVID)&&(att.ProductID==MyPID))//比對VID&PID~ { m_hHidIn=GetDeviceHandle(guid,hDeviceInfo,UsbIndex);//取得IN的HANDLE if(HidD_GetPreparsedData(m_hHidOut, &pPreData)) { if(HidP_GetCaps(pPreData, &cap)==HIDP_STATUS_SUCCESS) { RX_Len=cap.InputReportByteLength; //讀取單晶片傳的資料長度 TX_Len=cap.OutputReportByteLength;//讀取寫到單晶片資料長度 Label3->Caption=RX_Len; Label4->Caption=TX_Len; Label5->Caption="USB-HID連結"; } } return TRUE; } else { CloseHandle(m_hHidOut);//關閉USB連接!! Label3->Caption=""; Label4->Caption=""; Label5->Caption="USB-HID退出"; m_hHidOut = NULL; } } } }//FOR UsbIndex //------------------------------------------------------------------------ return FALSE; } 整個程式如附件.
------
vincent |
HUNK999
初階會員 發表:9 回覆:35 積分:28 註冊:2009-07-23 發送簡訊給我 |
===================引 用 vk8051 文 章=================== 我已經把站上的範例整理一次了,測試也OK只是現在ARM7的範例只傳2個BYTES,但是已經能夠通訊了,但是我發現到一個問題如下!! // 檢查是否有與VID,PID符合的HID 裝置 bool TLed_HID::CheckHidDevice() { GUID guid; HDEVINFO hDeviceInfo; HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; //------------------------------------------------------------------------ HidD_GetHidGuid(&guid);//先取得HID的GUID值 //------------------------------------------------------------------------ // 取得所有連結的HID Device interface hDeviceInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if( hDeviceInfo==INVALID_HANDLE_VALUE ) return FALSE; //------------------------------------------------------------------------ for( int UsbIndex=0; UsbIndex<50; UsbIndex )//逐一比對HID裝置的VID & PID~ { m_hHidOut = GetDeviceHandle(guid,hDeviceInfo,UsbIndex);//取得OUT的HANDLE<-----問題1:這邊我取得m_hHidOut的HANDLE並帶入write的涵式使用ok,但如果帶到read的涵式就會當機,原因為何,因為我看下面又讀了一次HANDLE值然後放到m_hHidIn帶入read涵式,請求這2個HANDLE不能共用一個HANDLE就好了嗎? int mode=0; // (close 令0 ; read handle 令1 ; write handle 令2) ... if(m_hHidOut!=INVALID_HANDLE_VALUE ) { if(HidD_GetAttributes(m_hHidOut,&att))//取得HID attribute~ { if((att.VendorID==MyVID)&&(att.ProductID==MyPID))//比對VID&PID~ { m_hHidIn=GetDeviceHandle(guid,hDeviceInfo,UsbIndex); //取得IN的HANDLE if(HidD_GetPreparsedData(m_hHidOut, &pPreData)&&(mode == 2)) <---IN 的handle做完後 , 會執行此行, 建議寫判斷式skip掉 { if(HidP_GetCaps(pPreData, &cap)==HIDP_STATUS_SUCCESS) { RX_Len=cap.InputReportByteLength; //讀取單晶片傳的資料長度 TX_Len=cap.OutputReportByteLength;//讀取寫到單晶片資料長度 Label3->Caption=RX_Len; Label4->Caption=TX_Len; Label5->Caption="USB-HID連結"; } } return TRUE; } else { CloseHandle(m_hHidOut);//關閉USB連接!! Label3->Caption=""; Label4->Caption=""; Label5->Caption="USB-HID退出"; m_hHidOut = NULL; } } } }//FOR UsbIndex //------------------------------------------------------------------------ return FALSE; } 整個程式如附件.
編輯記錄
HUNK999 重新編輯於 2009-08-03 18:35:55, 註解 無‧
|
vk8051
一般會員 發表:22 回覆:33 積分:21 註冊:2007-08-10 發送簡訊給我 |
請問多做那個判斷我的程式一樣可以讀寫嗎?
還是變成只能寫呀? ===================引 用 HUNK999 文 章=================== ===================引 用 vk8051 文 章=================== 我已經把站上的範例整理一次了,測試也OK只是現在ARM7的範例只傳2個BYTES,但是已經能夠通訊了,但是我發現到一個問題如下!! // 檢查是否有與VID,PID符合的HID 裝置 bool TLed_HID::CheckHidDevice() { GUID guid; HDEVINFO hDeviceInfo; HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; //------------------------------------------------------------------------ HidD_GetHidGuid(&guid);//先取得HID的GUID值 //------------------------------------------------------------------------ // 取得所有連結的HID Device interface hDeviceInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if( hDeviceInfo==INVALID_HANDLE_VALUE ) return FALSE; //------------------------------------------------------------------------ for( int UsbIndex=0; UsbIndex<50; UsbIndex )//逐一比對HID裝置的VID & PID~ { m_hHidOut = GetDeviceHandle(guid,hDeviceInfo,UsbIndex);//取得OUT的HANDLE<-----問題1:這邊我取得m_hHidOut的HANDLE並帶入write的涵式使用ok,但如果帶到read的涵式就會當機,原因為何,因為我看下面又讀了一次HANDLE值然後放到m_hHidIn帶入read涵式,請求這2個HANDLE不能共用一個HANDLE就好了嗎? int mode=0; // (close 令0 ; read handle 令1 ; write handle 令2) ... if(m_hHidOut!=INVALID_HANDLE_VALUE ) { if(HidD_GetAttributes(m_hHidOut,&att))//取得HID attribute~ { if((att.VendorID==MyVID)&&(att.ProductID==MyPID))//比對VID&PID~ { m_hHidIn=GetDeviceHandle(guid,hDeviceInfo,UsbIndex); //取得IN的HANDLE if(HidD_GetPreparsedData(m_hHidOut, &pPreData)&&(mode == 2)) <---IN 的handle做完後 , 會執行此行, 建議寫判斷式skip掉 { if(HidP_GetCaps(pPreData, &cap)==HIDP_STATUS_SUCCESS) { RX_Len=cap.InputReportByteLength; //讀取單晶片傳的資料長度 TX_Len=cap.OutputReportByteLength;//讀取寫到單晶片資料長度 Label3->Caption=RX_Len; Label4->Caption=TX_Len; Label5->Caption="USB-HID連結"; } } return TRUE; } else { CloseHandle(m_hHidOut);//關閉USB連接!! Label3->Caption=""; Label4->Caption=""; Label5->Caption="USB-HID退出"; m_hHidOut = NULL; } } } }//FOR UsbIndex //------------------------------------------------------------------------ return FALSE; } 整個程式如附件.
------
vincent |
HUNK999
初階會員 發表:9 回覆:35 積分:28 註冊:2009-07-23 發送簡訊給我 |
只要讀寫分開 , Firmware有讀寫pipe...就能分開獨立運作
CreateFile 理論上可以直接定義Read | Write 毋需透過true false區別讀寫 ReadFile會自動使用Read pipe WriteFile會使用Write pipe 另外也可以用RTHID.dll 做USB HID device的讀寫控制 http://sites.google.com/site/hidlibrary/ ===================引 用 vk8051 文 章=================== 請問多做那個判斷我的程式一樣可以讀寫嗎? 還是變成只能寫呀? ===================引 用 HUNK999 文 章=================== ===================引 用 vk8051 文 章=================== 我已經把站上的範例整理一次了,測試也OK只是現在ARM7的範例只傳2個BYTES,但是已經能夠通訊了,但是我發現到一個問題如下!! // 檢查是否有與VID,PID符合的HID 裝置 bool TLed_HID::CheckHidDevice() { GUID guid; HDEVINFO hDeviceInfo; HIDD_ATTRIBUTES att; PHIDP_PREPARSED_DATA pPreData; HIDP_CAPS cap; //------------------------------------------------------------------------ HidD_GetHidGuid(&guid);//先取得HID的GUID值 //------------------------------------------------------------------------ // 取得所有連結的HID Device interface hDeviceInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); if( hDeviceInfo==INVALID_HANDLE_VALUE ) return FALSE; //------------------------------------------------------------------------ for( int UsbIndex=0; UsbIndex<50; UsbIndex )//逐一比對HID裝置的VID & PID~ { m_hHidOut = GetDeviceHandle(guid,hDeviceInfo,UsbIndex);//取得OUT的HANDLE<-----問題1:這邊我取得m_hHidOut的HANDLE並帶入write的涵式使用ok,但如果帶到read的涵式就會當機,原因為何,因為我看下面又讀了一次HANDLE值然後放到m_hHidIn帶入read涵式,請求這2個HANDLE不能共用一個HANDLE就好了嗎? int mode=0; // (close 令0 ; read handle 令1 ; write handle 令2) ... if(m_hHidOut!=INVALID_HANDLE_VALUE ) { if(HidD_GetAttributes(m_hHidOut,&att))//取得HID attribute~ { if((att.VendorID==MyVID)&&(att.ProductID==MyPID))//比對VID&PID~ { m_hHidIn=GetDeviceHandle(guid,hDeviceInfo,UsbIndex); //取得IN的HANDLE if(HidD_GetPreparsedData(m_hHidOut, &pPreData)&&(mode == 2)) <---IN 的handle做完後 , 會執行此行, 建議寫判斷式skip掉 { if(HidP_GetCaps(pPreData, &cap)==HIDP_STATUS_SUCCESS) { RX_Len=cap.InputReportByteLength; //讀取單晶片傳的資料長度 TX_Len=cap.OutputReportByteLength;//讀取寫到單晶片資料長度 Label3->Caption=RX_Len; Label4->Caption=TX_Len; Label5->Caption="USB-HID連結"; } } return TRUE; } else { CloseHandle(m_hHidOut);//關閉USB連接!! Label3->Caption=""; Label4->Caption=""; Label5->Caption="USB-HID退出"; m_hHidOut = NULL; } } } }//FOR UsbIndex //------------------------------------------------------------------------ return FALSE; } 整個程式如附件. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |