如何以编程方式拔出并重新插入任意USB设备?
我正在尝试修复伪装成虚拟COM端口的无响应USB设备。手动重新插入可以工作,但其中最多可以包含12个。是否有API命令可以执行与拔出/重新插入周期等效的程序?
解决方案
不幸的是,我没有一个知道。物理上拔下USB连接会通过上拉电阻来执行特定的电子操作,从而使设备知道已拔下。我还没有遇到一个主机,该主机试图能够在不物理拔出的情况下模拟这种情况。
如果在任何特定主机上有多个主机,则可以通过将它们从计算机上插入自己专用的USB集线器中来节省一些时间/沮丧,至少只有一根电缆可以拔出/重新启动以重启几个设备一次。
当然,我们可能已经想到了。 :-)
可以通过编程方式卸载USB驱动器,但是,我不知道是否可以通过代码完成卸载。
在使用C(代码项目)弹出USB磁盘中查找以下内容:
CM_Request_Device_Eject function This is the SetupApi function that ejects a device (any device that can be ejected). It takes a device instance handle (or devInst) as input...
正如格雷格·休吉尔(Greg Hewgill)所说,我认为这是不可能的。
整个USB启动的启动是由USB从设备(在情况下为设备)触发的。 USB主机(PC)可以向设备发送一条消息,告诉它关闭,但是一旦完成,就由设备重新启动。主机不能强迫它。
更糟糕的是,我们很可能会发现USB设备正在检测正在插入的插头(通过检测电源线上的USB电压)以启动。对于总线供电的设备尤其如此。
听起来情况和尝试卸下/重新安装USB驱动器的情况有所不同。卸载USB驱动器后,没有理由无法在PC上枚举它。我们实际上并没有重置USB驱动器,只是使它的文件系统处于非活动状态。
我已经将其用于自动化测试。我们想出的最好的解决方案似乎是USB集线器能够在设备消耗过多功率时断开它们的连接。从USB角度来看,看来USB主机可能会指示集线器这样做。使用12台设备,我们将拥有集线器,因此建议我们调查一下该路径。
我们使用它来可编程断开USB设备的连接。
想法:在"设备管理器"下,可以右键单击计算机图标(在设备树顶部),然后"扫描更改"。我不确定100%,但是我认为,如果我们"弹出" USB设备(等效于软件"拔出"),然后"扫描硬件更改",即使它从未真正离开端口,它也会备份显示。
如果我对此表示正确,则可以使用Microsoft.Win32.Shell类来模拟打开"控制面板"->"管理工具"->"设备管理器"并运行上下文菜单项。无论如何,值得一试。
设备本身可以执行此操作(即执行USB断开/重新连接顺序)。
我们是否已与设备制造商联系,或者如果我们是制造商,请联系设计它的EE?
当我设计USB嵌入式设备时,必须通过USB来完成编程,但我必须这样做,但是该设备必须能够断开并重新连接好几个点才能完成该过程。
除此之外,还有一种蛮力方法,即在设备管理器中禁用USB主机设备(我认为这可以在软件中完成),然后重新启用它。
如果没有其他问题,Phidget拥有USB控制的中继板,我们可以将其用于将电源或者USB线本身连接到集线器或者单个设备。
-亚当
使用Devcon.exe"删除"然后"重新扫描"怎么办?
博士
前段时间,我不得不为我的车载计算机项目执行此操作。触摸屏驱动程序不喜欢进入休眠状态,因此当计算机从休眠状态恢复时,需要重新插入触摸屏驱动程序。我最终解决它的方法是使用DigitalRacer建议的Devcon.exe。但是,窍门是在控制器上执行删除/重新扫描操作无效。我必须在设备上游的HUB上进行删除/重新扫描(随后断开所有连接的设备的连接)。