在 Windows 上的软件中关闭 USB 设备

Posted

技术标签:

【中文标题】在 Windows 上的软件中关闭 USB 设备【英文标题】:Power off an USB device in software on Windows 【发布时间】:2010-09-29 01:55:03 【问题描述】:

我想通过 Windows 上的软件重新启动 USB 设备。

我正在开发小型 USB 电源微控制器。该芯片将在电源循环时恢复本机行为并允许下载代码。由于我的代码会在出现问题时使设备崩溃——使其忽略所有 USB 命令——我必须从系统中物理拔出设备。

我想远程进行开发,而不必亲自到场。

到目前为止,我已经尝试使用“devcon”来禁用部分 USB 堆栈。虽然这会将集线器带入 D3(应该关闭电源!),但仍然为设备供电。

是否有任何预先存在的解决方案或 SetupAPI 技巧可能有所帮助?

【问题讨论】:

【参考方案1】:

一些 USB 集线器能够关闭其下游设备的电源。

“是否可以从 Ubuntu 启动 USB 集线器上的端口?” https://askubuntu.com/questions/149242/is-it-possible-to-power-up-ports-on-a-usb-hub-from-ubuntu 指向 hub-ctrl.c 的一些 c 源代码

见:http://www.gniibe.org/development/ac-power-control-by-USB-hub/index

我在 Ubuntu 上使用 Dream-Cheeky USB LED 单元对此进行了测试,它似乎确实关闭了电源 - 尽管再次打开时,设备已经记住(!)它的 LED 开/关状态??? - 当我拔下 USB 线并将其重新插入 LED 时,这并没有发生...

好像有人看过为 Windows 编译这个,但我找不到结果,抱歉。

【讨论】:

【参考方案2】:

您可以使用硬件继电器并通过软件控制它:http://pintant.cat/2012/05/12/power-off-usb-device/(当然,将使用 2 个 USB 端口 :-) 一个用于设备,一个用于继电器)。

【讨论】:

为什么你发布的答案与 3 年前发布的答案重复?【参考方案3】:

由于它用于开发/测试而不是生产,我建议将solid-state_relay 作为第二个设备的一部分,并使用它来循环打开 USB 连接的电源。

【讨论】:

我们使用这种方法,只是功率继电器而不是电,我们将Vbus电缆插入功率继电器。我知道有专门用于此目的的 USB 继电器,但我认为它们很贵。 是否已经存在 USB 集线器,当主机将集线器置于低功耗模式时会关闭设备?由于这是在实验室环境中,使用定制硬件将需要一场艰苦的战斗。 我将链接作为单独的答案发布。【参考方案4】:

如果您购买this external USB hub,Windows 上有一个简单的解决方案。它有一个未记录的功能,只要在 Windows 设备管理器中“启用”集线器,就会为所有连接的 USB 设备循环供电。您可以手动执行此操作:

    运行“设备管理器” 展开“通用串行总线控制器” 打开相应“通用 USB 集线器”的属性 选择“驱动程序”标签 点击“禁用”按钮 单击“启用”按钮。集线器将暂时禁用其所有 4 个 USB 端口的电源输出,然后再次启用。

您也可以通过任何以管理员权限运行的 Windows 应用程序以编程方式执行此操作。这里是an example in C#。

我已成功使用此技术为“锁定”的 USB 设备循环供电。它肯定胜过物理拔出设备,尤其是在远程或无人 PC 上。

【讨论】:

引用的页面https://www.amazon.com/B00007AKAZ不存在。【参考方案5】:

很遗憾,这在普通 PC 上是不可能的。

USB 主机芯片组无法完全断电。您可以在 USB 2.0 或 3.0 中发出一些信号来要求设备进入睡眠状态,但即使 PC 关闭,端口也会提供电源。 (如果需要,iPod 之类的设备仍然可以充电。)

【讨论】:

这是不正确的,取决于特定的硬件。有一个选项可以关闭/打开根集线器的电源,有时您不能对每个端口执行此操作,并且仅适用于所有根集线器端口。但你绝对可以关闭端口

以上是关于在 Windows 上的软件中关闭 USB 设备的主要内容,如果未能解决你的问题,请参考以下文章

禁止在 android 设备管理中关闭设备

在VxWorks中关闭无响应设备文件端口的正确方法是啥?

如何在'rake test'中关闭警告'ruby -w'?

在 windows 中关闭显示器

如果从设置中关闭位置,则获取位置

在 android 中关闭应用程序时,在真实设备上未收到一个信号通知