導航:首頁 > 器材知識 > USB設備如何實現延時枚舉

USB設備如何實現延時枚舉

發布時間:2021-03-07 18:02:20

❶ 怎麼把所有的window所有usb設備的guid枚舉出來

有現成的,希望對你有所幫助

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#include <stdio.h>
#include <tchar.h>

// TODO: reference additional headers your program requires here
// EnumDevice.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <guiddef.h>
#include <windows.h>
#include <setupapi.h>
#include <vector>
#include <iostream>

using namespace std;

//U盤 interface class GUID
GUID IID_CLASS_WCEUSBS ={0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed};

BOOL SearchDevice(vector<wstring> &vDevicePath)
{
BOOL bRes = FALSE;
LPGUID pInterfaceGuid = &IID_CLASS_WCEUSBS;

HDEVINFO hDeviceInfo = SetupDiGetClassDevs( pInterfaceGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

if (INVALID_HANDLE_VALUE == hDeviceInfo)
{
goto Exit;
}

// enum device interface
SP_DEVICE_INTERFACE_DATA spDevInterData; //a structure of device interface data

memset(&spDevInterData, 0x00, sizeof(SP_DEVICE_INTERFACE_DATA));
spDevInterData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

DWORD dwIndex = 0;

while (TRUE)
{
if (!eviceInterfaces( hDeviceInfo,
NULL,
pInterfaceGuid,
dwIndex,
&spDevInterData))

{
if (ERROR_NO_MORE_ITEMS == GetLastError())
{
OutputDebugStringW(L"No more interface");
}
else
{
OutputDebugStringW(L"SetupDiEnumDeviceInterfaces Error");
}

goto Exit;
}

// get length of interface detail info
DWORD dwRequiredLength = 0; //for getting length of inter face detail data

if (!( hDeviceInfo,
&spDevInterData,
NULL,
0,
&dwRequiredLength,
NULL))
{
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
{
OutputDebugStringW(L"calculate require length");
//goto Exit;
}
}

// get interface detail info
PSP_DEVICE_INTERFACE_DETAIL_DATA pSpDIDetailData; //a pointer to interface detail data

pSpDIDetailData = NULL;
pSpDIDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwRequiredLength);

if(NULL == pSpDIDetailData)
{
OutputDebugStringW(L"HeapAlloc Memory Failed");

if (!SetupDiDestroyDeviceInfoList(hDeviceInfo))
{
OutputDebugStringW(L"SetupDiDestroyDeviceInfoList Error");
}

goto Exit;
}

pSpDIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

if (!( hDeviceInfo,
&spDevInterData,
pSpDIDetailData,
dwRequiredLength,
&dwRequiredLength,
NULL))
{
OutputDebugStringW(L" Error");
goto Exit;
}

wstring wcsDevicePath = pSpDIDetailData->DevicePath;

vDevicePath.push_back(wcsDevicePath);

if (NULL != pSpDIDetailData)
{
HeapFree(GetProcessHeap(), 0, pSpDIDetailData);
pSpDIDetailData = NULL;
}

dwIndex++;
}

if (!SetupDiDestroyDeviceInfoList(hDeviceInfo))
{
OutputDebugStringW(L"SetupDiDestroyDeviceInfoList Error");
}

bRes = TRUE;

Exit:
return bRes;
}

int _tmain(int argc, _TCHAR* argv[])
{

vector<wstring> vDevicePath;
SearchDevice(vDevicePath);

vector<wstring>::iterator iter;

for (iter = vDevicePath.begin(); iter != vDevicePath.end(); ++iter)
{
wcout << (*iter).c_str() << endl;
}

system("pause");
return 0;
}
// stdafx.cpp : source file that includes just the standard includes
// EnumDevice.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

❷ linux 下如何實現USB設備重新枚舉

umount,mount,umount,mount....巴拉巴拉

❸ usb的晶元上的枚舉過程是怎樣的

{
Sleep(1);
cout<<"ticket 1:"<<ticket--<<endl;
SetEvent(g_hEvent); //設置為有信號(沒內有被申容請)
}
else
{SetEvent(g_hEvent); //設置為有信號(沒有被申請)
break;
}
}

❹ usb設備端枚舉,11個標准請求函數實體,6個類請求函數實體

您好,一旦獲悉有新設備連接上來,主機就會發送一系列的請求(Resqusts)給設備所掛載到的hub,再由hub建立起一條連接主機(Host)和設備(Device)之間的通信通道。然後主機以控制傳輸(Control Transfer)的方式,通過端點0(Endpoint 0)對設備發送各種請求,設備收到主機發來的請求後回復相應的信息,進行枚舉(Enumerate)操作。所有的USB設備必須支持標准請求(StandardRequests),控制傳輸方式(Control Transfer)和端點0(Endpoint 0)。
在講解枚舉之前,先大概說說USB的一種傳輸模式——控制傳輸。這種傳輸在USB中是非常重要的,它要保證數據的正確性,在設備的枚舉過程中都是使用控制傳輸的。控制傳輸分為三個階段:①建立階段。②數據階段。③確認階段。
建立(setup)階段:都是由USB主機發起,它是一個setup數據包,裡麵包含一些數據請求的命令以及一些數據。如果建立階段是輸入請求,那麼數據階段就要輸入數據;如果建立階段是輸出請求,那麼數據階段就要輸出數據。如果在數據階段,即便不需要傳送數據,也要發一個0長度的數據包。數據階段過後就是確認階段。確認階段剛好跟數據階段相反,如果是輸入請求,則它是一個輸出數據包;如果是輸出請求,則它是一個輸入數據包。確認階段用來確認數據的正確傳輸。

❺ HID設備在USB的枚舉過程

http://www.docin.com/p-293839161.html
論文來的源2.9節有介紹,

❻ usb host怎麼做才能開始設備枚舉

做過,剛搞出來了,但是時鍾問有題,用RCC_Getclock函數串口輸出系統時鍾,發現都是不對的。專後來屬在官網下載了一個stm32f2xx專用的時鍾配置工具,配置好後直接生成了system_stm32f2xx.c然後替代原來的就可以正常枚舉了。stm32f2xx.h中的外部時鍾定義HSE_Value也要改為實際用的晶振頻率可是插上我的8GU盤,枚舉完成後直接進入Unrecoverederrorstate,還是想找固件的問題,後來看到有人說兼容性問題,找了個1G的U盤,插上去直接就可以讀寫文件了。。這兩天正在搞兼容性,還有官方的FATFS沒有加長文件名支持,很多小寫字母都變大寫了,到時候用原子哥的內存管理讓他支持長文件名。

❼ usb設備沒有驅動程序情況下能否完成枚舉

是的先要安裝驅動,還有你用的bus hound版本是多少的?可能需要更新了。

❽ usb hid設備從枚舉到打開花費多長時間

時間應該不長挺快的啊

❾ 怎麼利用USB介面走非USB協議完成枚舉

一旦獲悉有新設備連接上來,主機就會發送一系列的請求(Resqusts)給設備所掛載到的hub,再由hub建立起一條連接主機(Host)和設備(Device)之間的通信通道。然後主機以控制傳輸(Control Transfer)的方式,通過端點0(Endpoint 0)對設備發送各種請求,設備收到主機發來的請求後回復相應的信息,進行枚舉(Enumerate)操作。所有的USB設備必須支持標准請求(StandardRequests),控制傳輸方式(Control Transfer)和端點0(Endpoint 0)。

在講解枚舉之前,先大概說說USB的一種傳輸模式——控制傳輸。這種傳輸在USB中是非常重要的,它要保證數據的正確性,在設備的枚舉過程中都是使用控制傳輸的。控制傳輸分為三個階段:①建立階段。②數據階段。③確認階段。

建立(setup)階段:都是由USB主機發起,它是一個setup數據包,裡麵包含一些數據請求的命令以及一些數據。如果建立階段是輸入請求,那麼數據階段就要輸入數據;如果建立階段是輸出請求,那麼數據階段就要輸出數據。如果在數據階段,即便不需要傳送數據,也要發一個0長度的數據包。數據階段過後就是確認階段。確認階段剛好跟數據階段相反,如果是輸入請求,則它是一個輸出數據包;如果是輸出請求,則它是一個輸入數據包。確認階段用來確認數據的正確傳輸。

❿ usb設備枚舉

有現成的,希望對你有所幫助

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#include <stdio.h>
#include <tchar.h>

// TODO: reference additional headers your program requires here
// EnumDevice.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <guiddef.h>
#include <windows.h>
#include <setupapi.h>
#include <vector>
#include <iostream>

using namespace std;

//U盤 interface class GUID
GUID IID_CLASS_WCEUSBS ={0xa5dcbf10, 0x6530, 0x11d2, 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed};

BOOL SearchDevice(vector<wstring> &vDevicePath)
{
BOOL bRes = FALSE;
LPGUID pInterfaceGuid = &IID_CLASS_WCEUSBS;

HDEVINFO hDeviceInfo = SetupDiGetClassDevs( pInterfaceGuid,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

if (INVALID_HANDLE_VALUE == hDeviceInfo)
{
goto Exit;
}

// enum device interface
SP_DEVICE_INTERFACE_DATA spDevInterData; //a structure of device interface data

memset(&spDevInterData, 0x00, sizeof(SP_DEVICE_INTERFACE_DATA));
spDevInterData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

DWORD dwIndex = 0;

while (TRUE)
{
if (!SetupDiEnumDeviceInterfaces( hDeviceInfo,
NULL,
pInterfaceGuid,
dwIndex,
&spDevInterData))

{
if (ERROR_NO_MORE_ITEMS == GetLastError())
{
OutputDebugStringW(L"No more interface");
}
else
{
OutputDebugStringW(L"SetupDiEnumDeviceInterfaces Error");
}

goto Exit;
}

// get length of interface detail info
DWORD dwRequiredLength = 0; //for getting length of inter face detail data

if (!( hDeviceInfo,
&spDevInterData,
NULL,
0,
&dwRequiredLength,
NULL))
{
if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
{
OutputDebugStringW(L"calculate require length");
//goto Exit;
}
}

// get interface detail info
PSP_DEVICE_INTERFACE_DETAIL_DATA pSpDIDetailData; //a pointer to interface detail data

pSpDIDetailData = NULL;
pSpDIDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwRequiredLength);

if(NULL == pSpDIDetailData)
{
OutputDebugStringW(L"HeapAlloc Memory Failed");

if (!SetupDiDestroyDeviceInfoList(hDeviceInfo))
{
OutputDebugStringW(L"SetupDiDestroyDeviceInfoList Error");
}

goto Exit;
}

pSpDIDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

if (!( hDeviceInfo,
&spDevInterData,
pSpDIDetailData,
dwRequiredLength,
&dwRequiredLength,
NULL))
{
OutputDebugStringW(L" Error");
goto Exit;
}

wstring wcsDevicePath = pSpDIDetailData->DevicePath;

vDevicePath.push_back(wcsDevicePath);

if (NULL != pSpDIDetailData)
{
HeapFree(GetProcessHeap(), 0, pSpDIDetailData);
pSpDIDetailData = NULL;
}

dwIndex++;
}

if (!SetupDiDestroyDeviceInfoList(hDeviceInfo))
{
OutputDebugStringW(L"SetupDiDestroyDeviceInfoList Error");
}

bRes = TRUE;

Exit:
return bRes;
}

int _tmain(int argc, _TCHAR* argv[])
{

vector<wstring> vDevicePath;
SearchDevice(vDevicePath);

vector<wstring>::iterator iter;

for (iter = vDevicePath.begin(); iter != vDevicePath.end(); ++iter)
{
wcout << (*iter).c_str() << endl;
}

system("pause");
return 0;
}
// stdafx.cpp : source file that includes just the standard includes
// EnumDevice.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

閱讀全文

與USB設備如何實現延時枚舉相關的資料

熱點內容
設備的維護保養有什麼區別 瀏覽:670
探究水沸騰的實驗裝置名稱 瀏覽:405
50平方不用空調怎麼製冷 瀏覽:741
濾油機自動排水裝置 瀏覽:551
工具箱鎖扣生產 瀏覽:76
內圓軸承型號怎麼計算 瀏覽:842
燃氣閥門復位按鈕在哪 瀏覽:336
免費領化學實驗裝置 瀏覽:536
閥門廠焊工主要幹嘛 瀏覽:797
lol皮膚使用工具箱 瀏覽:494
樂的五金製品有限公司 瀏覽:120
燃氣入戶總閥門後的管道是 瀏覽:272
想把機械課程學好怎麼弄 瀏覽:479
施工機械配備怎麼來的 瀏覽:44
帶反饋的閥門定位器怎麼接線 瀏覽:458
換完組合儀表需要匹配什麼 瀏覽:192
什麼時候運行設備 瀏覽:896
為什麼寶馬機械轉速表 瀏覽:162
東莞市鳳崗五金製品廠 瀏覽:711
微信號檢測工具箱 瀏覽:878