USB口的区分

x44348428 2009-11-26 11:50:59
1:请问同一台电脑上的两个USB口,连接了两个相同的设备。可以通过API区分开两设备分别对应得是哪个USB口吗?也就是说可以用API来得出USB口的唯一标识吗?

2:假设问题1成立。那如果我一根USB线上接了三个设备(Hid设备、Flash芯片、声卡),插到电脑上一个USB口。那这三个设备里分别都有对应此USB口的唯一标识信息吗?若有,如何用API得到呢?

谢谢!
...全文
182 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈利路亚1874 2009-12-08
  • 打赏
  • 举报
回复
端口号好像和插入的顺序有关!
x44348428 2009-12-03
  • 打赏
  • 举报
回复
to Fish1112:
不知可否具体些?万分感谢!
尘雨 2009-12-02
  • 打赏
  • 举报
回复
关注此贴
joaryyu 2009-12-02
  • 打赏
  • 举报
回复
这个肯定可以实现的,我确定,因为我试过。解决问题那只是技术上的问题了。
nudt0929 2009-12-02
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧
x44348428 2009-12-01
  • 打赏
  • 举报
回复
谢谢大家的回复,由于当时比较着急,各个区都开了帖子。希望有会的兄弟都到以下帖子讨论 十分谢谢!

http://topic.csdn.net/u/20091126/23/fcf66d9a-447e-4239-8d0b-af15b0069be2.html
myshinji 2009-11-29
  • 打赏
  • 举报
回复
设备插入时,可以获得 其连接的 hub name(可以用CreateFile打开的那种),与连接的Port号。(全是枚举+判断相等条件)

可以在 4楼提供的代码里找到。
用户 昵称 2009-11-29
  • 打赏
  • 举报
回复
你枚举时就肯定会有顺序,利用物理顺序来区分就行了。俺经常枚举同一类型的不同usb个体。
sunshine502 2009-11-28
  • 打赏
  • 举报
回复
是完全可以区分的,这点毫无疑问
supconsupcon 2009-11-27
  • 打赏
  • 举报
回复
第一条是可以实现的
首先你的应用程序必须要先向操作系统注册notify消息,以便USB口有设备连入或断开时给你的应用程序窗口发送消息,API:RegisterDeviceNotification可以帮你完成消息的注册
之后你就可以在WindowProc或其它类似的消息拦截函数拦截到你需要的消息,例如在WindowProc中处理:
switch (message)
{
case WM_DEVICECHANGE:
{
switch(wParam)
{
case DBT_DEVICEARRIVAL://A device has been inserted and is now available.
{
// Handle device arrival
GetDlgItem(IDC_STATIC)->SetWindowText("新设备插入!");
TRACE("新设备插入!\n");

DEV_BROADCAST_HDR* p = (DEV_BROADCAST_HDR*) lParam;

}
break;

case DBT_DEVICEQUERYREMOVE://Permission to remove a device is requested. Any application can deny this request and cancel the removal.
// Handle device removal request
GetDlgItem(IDC_STATIC)->SetWindowText("请求设备删除!");
TRACE("请求设备删除!\n");
break;

case DBT_DEVICEREMOVECOMPLETE://Device has been removed.
// Handle device removal
GetDlgItem(IDC_STATIC)->SetWindowText("设备删除!");
TRACE("设备删除!\n");
break;

case DBT_DEVICEQUERYREMOVEFAILED://Request to remove a device has been canceled.
GetDlgItem(IDC_STATIC)->SetWindowText("设备删除失败!");
TRACE("设备删除失败!\n");
break;
case DBT_DEVICEREMOVEPENDING://Device is about to be removed. Cannot be denied.
GetDlgItem(IDC_STATIC)->SetWindowText("设备已删除!");
TRACE("设备已删除!\n");
break;

case DBT_DEVICETYPESPECIFIC://Device-specific event.
GetDlgItem(IDC_STATIC)->SetWindowText("特殊事件!");
TRACE("特殊事件!\n");
break;
case DBT_CONFIGCHANGED://Current configuration has changed.
GetDlgItem(IDC_STATIC)->SetWindowText("配置改变!");
TRACE("配置改变!");
break;
case DBT_DEVNODES_CHANGED://Device node has changed.
GetDlgItem(IDC_STATIC)->SetWindowText("设备节点改变!");
TRACE("设备节点改变!\n");
break;
case DBT_CUSTOMEVENT://.
GetDlgItem(IDC_STATIC)->SetWindowText("\n");
TRACE("device !\n");
break;

}
}
}

第二条应该也是能实现的,比如摄像机或U盘,操作系统就能区分,应该是设备有驱动程序的支持才能办到吧
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧
x44348428 2009-11-27
  • 打赏
  • 举报
回复
to supconsupcon:

谢谢你的回答。你所说的“消息拦截”是可以,但我现在的问题是得把这个usb口唯一标识取出来,然后放在列表里。以供我的上层软件控制指令发往哪个usb口上的设备。
Dingnifei123 2009-11-27
  • 打赏
  • 举报
回复
supconsupcon 2009-11-27
  • 打赏
  • 举报
回复
你查查MSDN就知道了,
HDEVNOTIFY RegisterDeviceNotification(
HANDLE hRecipient,
LPVOID NotificationFilter,
DWORD Flags
);
再看MSDN的一个示例:
BOOL DoRegisterDeviceInterface(
GUID InterfaceClassGuid,
HDEVNOTIFY *hDevNotify
)
/*
Routine Description:
Registers for notification of changes in the device interfaces for
the specified interface class GUID.

Parameters:
InterfaceClassGuid - The interface class GUID for the device interfaces. GUID还不够唯一吗?

hDevNotify - Receives the device notification handle. On failure,
this value is NULL.

Return Value:
If the function succeeds, the return value is TRUE.

If the function fails, the return value is FALSE.
*/
{
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
DWORD Err;

ZeroMemory( ¬ificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size =
sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;

*hDevNotify = RegisterDeviceNotification( hWnd,
¬ificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE
);

if(!*hDevNotify)
{
Err = GetLastError();
printf( "RegisterDeviceNotification failed: %lx.\n", Err);
return FALSE;
}

return TRUE;
}

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧