全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5066
推到 Plurk!
推到 Facebook!

再請教USB HID的問題

答題得分者是:HUNK999
vk8051
一般會員


發表:22
回覆:33
積分:21
註冊:2007-08-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-03 16:20:28 IP:220.130.xxx.xxx 訂閱
我已經把站上的範例整理一次了,測試也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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-03 18:27:40 IP:220.130.xxx.xxx 未訂閱

===================引 用 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-08-03 20:24:03 IP:114.42.xxx.xxx 訂閱
請問多做那個判斷我的程式一樣可以讀寫嗎?
還是變成只能寫呀?
===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-08-03 23:16:29 IP:118.169.xxx.xxx 未訂閱
只要讀寫分開 , 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;
}

整個程式如附件.
編輯記錄
HUNK999 重新編輯於 2009-08-03 23:17:14, 註解 無‧
HUNK999 重新編輯於 2009-08-14 14:33:55, 註解 無‧
HUNK999 重新編輯於 2009-08-27 19:36:54, 註解 無‧
系統時間:2017-10-22 18:09:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!