[十万火急]:多个相同的设备同时连接到不同的usb口,如何与指定usb接口上的设备进行通信。
请各位高手大虾多多指教啊:
有多个完全相同的设备同时连接到一台机器的不同usb口,比如序号为1、2、3、4,现在想对三号接口上的设备进行操作。不知道如何用createfile函数打开这个设备,因为我无法获得这个设备的设备路径。
我现在获得设备路径的方法是用setupdigetclassdevs函数获得符合条件(设备的GUID已知)的设备信息集,然后用setupDiGetInterfaceDeviceDetail获得该设备的设备路径,再用createfile函数打开。但是这种方法无法确切的知道设备是连接到哪个接口上的。
不知哪位大虾做过类似的东西,请指点一二,多谢多谢!
给大家推荐个
好的技术群 大家一起学习啊
32759197
通过枚举设备,如果你要对多个同种设备进行操作,可以先确定它们的VID和PID,进行栓选。
如果找到一个符合指定VID和PID的设备,为它创建资源,同时保存好它的句柄。
另外,你不必去关心哪个设备被连接到哪个端口。
不好办。
Windows没有API能知道USB Device插入在哪个插口(没有意义),也不保证setupdi接口枚举出来的顺序。Windows内部生成的设备名的确有所区别,但这种内部规则是不公开的而且不保证不会变化。
我想不到关心连接的插口有什么意义。实际上电脑的USB插口也没有(也不能)给出顺序编号。
如果你是在需要这样,但至少给出区别,如先后顺序插入,还有办法区别。
当然,一个或多个应用程序能分别打开所有相同的USB Device,但是,不能确保是你想要的顺序,即使Windows枚举出的顺序刚好是你要的但你也不能相信。
如果是自己开发的USB Device,可以使用特别的机制来区分。
感谢楼上各位的热心解答,我先解释一下为什么需要解决这个问题。
公司开发的一个设备,驱动是自己开发的,在pc端做了一个程序对该设备进行远程操作(如烧写,硬件测试、调试等等),现在想实现一个功能,把多个设备连接到pc上(直接连接或通过一个usb hub),用程序对这些设备进行控制,有可能是批量烧写,也有可能对每个设备进行不同操作,如果能够知道哪个设备连接到哪个端口,就可以通过端口号标识该设备并进行操作。
我现在可以通过扫描端口知道哪个端口上连接了设备,也可以获取设备的descriptor(参考usbview),但是没有办法获取这个设备的device path,也就没有办法用createfile打开这个设备。
而使用SDK 的setupXXXX系列函数能获取所有的设备并打开,但是没有办法知道哪个设备连接到了哪个端口。
在网上搜了一些,发现有很多人都碰到过类似的需求,不知哪位大虾解决了这个问题,请不吝赐教,另外感兴趣的话,大家也可以一起讨论一下。
或者换个思路,如果已经通过扫描(usbview中的方法)确定在某个接口上连接了该设备,也可以获得设备的descriptor,那么如何进一步获取这个设备的devicepath?
我没做过但我知道通过setupdi和cfgmgr32接口确实可以得到设备插入的USB HUB端口号,问题是,应用软件得到了端口号你还是不知道是哪个设备,因为电脑或HUB上并没有标明端口号,你还得一个一个去试,当生产环境变化时还得重找,不是好的工装,容易出现生产问题。
既然是自己开发的设备,我提个方案:
USB Descriptor中有一个产品描述字符串,如:"My USB Device xxx#",在烧设备的MCU Flash/EEPROM 时用产生序列号的办法对每个设备烧入不同的"xxx",作为编号,同时将这个编号标记在设备面板上。应用程序可以得到这个产品字符串显示在设备列表中供工作人员选择。
一目了然,不必关心所插的端口,灵活多了。
更专业的办法是,应用程序可以通过USB驱动程序向设备要求产品序列号/编号等信息。
嗯,这也是一个比较好的解决办法,不过我的这个程序主要功能就是用来烧写,好像是一个“鸡生蛋,蛋生鸡”的问题啊~
这很好解决吧。
在产品开发之中、产品成型之前,你们不得先用其他烧录器烧试验品吗?
或者,先做出烧录软件,但只插一个烧录器用于烧录烧录器IC(汗),就先避开了设备选择问题嘛。
USB有一个iSerialNumber 可以用来区分同一型号的设备.具体情况,查看USB协议,和windows DDK
楼上说的对,用iSerialNumber比用iProduct好。
如果你使用自定义的驱动,DevicePath中的DeviceName会按顺序加一个数值,比如识别到的第一个设备是DeviceName0,第二个设备是DeviceName1,... ...,依次类推,其他部分是一致的。
然后人工来确认是几个号码,比如在PC端控制DeviceName0设备亮灯或者Beep一下,这样,操作员就知道这是一号设备了。
如何要实现自动识别,就需要将设备号固化在设备中需要,将设备全部连接后,再通过接口查询来纠正,比如设备号为1的设备当前对应DeviceName3,那么以后就知道打开DeviceName3的设备文件,就是1号设备了。
我做的工作和这类似,我的是手机USB下载,PC连接不同的手机
我们公司的思路是通过写不同的SN号来区别,你说的“鸡生蛋”的问题如果在连接设备之前就写好了SN号就会没有了,
然后通过SN号来枚举!
希望可以帮到你!
哇,看看日期发现这个帖子也太久了,不好意思
我现在要做一个应用程序放在WINCE下来接受PC端USB的小心,
不知道咋办,提供点帮助吧!
我的邮箱wandyb1787@sina.com
也可以用电话联系我在深圳