Как программно отключить и снова подключить произвольное USB-устройство?

Я пытаюсь исправить невосприимчивое USB-устройство, маскирующееся под виртуальный COM-порт. Ручное подключение работает, но их может быть до 12 штук. Есть ли команда API для выполнения программного эквивалента цикла отключения / повторного подключения?

возможный дубликат Безопасное извлечение USB-накопителя с помощью Win32 API?

Cody Gray 15.01.2012 12:00

Программное обеспечение, такое как USB Safely Remove, может повторно подключить отключенное USB-устройство, перезапустив весь USB-концентратор (включая другие подключенные устройства).

Ondrej Galbavý 21.03.2015 00:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
34
2
52 318
13

Ответы 13

К сожалению, я не знаю ни одного. Физическое отключение USB-соединения приводит к определенным электронным функциям с подтягивающими резисторами, так что устройство знает, что оно отключено. Я не встречал хоста, который пытался бы смоделировать это состояние без физического отключения.

Если у вас есть более одного из них на каком-либо конкретном хост-компьютере, вы можете сэкономить время / нервы, подключив их к их собственному выделенному USB-концентратору, выходящему из машины - по крайней мере, нужно отключить / подключить только один кабель, чтобы перезапустить пару устройств одновременно.

Вы, наверное, думали об этом, конечно. :-)

Программно размонтирование USB-накопителя можно сделать, однако я не знаю, можно ли перемонтировать с помощью кода.

В Извлечение USB-дисков с помощью C# (Кодовый проект) ищите это:

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...

Может устройство, которое "... маскируется под виртуальный com-порт". быть изгнанным?

Andrew Edgecombe 27.09.2008 04:30

Как сказал Грег Хьюгилл, я не думаю, что это возможно.

Инициирование всего запуска usb запускается ведомым устройством usb (в вашем случае - вашим устройством). USB-хост (компьютер) может отправить устройству сообщение, чтобы оно отключилось, но как только это будет сделано, устройство должно снова запустить резервное копирование. Хозяин не может заставить это сделать.

Что еще хуже, вы, вполне возможно, обнаружите, что устройство USB определяет вставляемую вилку (путем определения напряжения USB на линиях электропередач) для запуска. Это особенно верно для устройств с питанием от шины.


Похоже, есть отличия от вашей ситуации и от случая попытки размонтировать / перемонтировать USB-накопители. Когда USB-накопитель отключен, нет причин, по которым он не может оставаться в списке на ПК. На самом деле вы не сбрасываете USB-накопитель, а просто делаете его файловую систему неактивной.

Я посмотрел на это для автоматизированных тестов. Лучшее решение, которое мы придумали, - это способность USB-концентраторов отключать устройства, когда они потребляют слишком много энергии. С точки зрения USB, похоже, что хост USB может дать команду концентратору сделать это. С 12 устройствами у вас будут концентраторы, поэтому я предлагаю изучить этот путь.

Мы использовали это для программируемого отключения USB-устройств.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это не программное решение.

lahjaton_j 16.06.2016 14:33

Мысль: в Диспетчере устройств вы можете щелкнуть правой кнопкой мыши значок своего компьютера (вверху дерева устройств) и «выполнить поиск изменений». Я не уверен на 100%, но я думаю, что если вы «извлечете» USB-устройство (эквивалент программного «отсоединения»), а затем выполните сканирование на предмет изменений оборудования, оно отобразится в резервной копии, даже если оно на самом деле никогда не покидало порт.

Если я прав насчет этого, вы можете использовать класс Microsoft.Win32.Shell для имитации открытия Панели управления -> Администрирование -> Диспетчер устройств и запуска пункта контекстного меню. В любом случае стоит попробовать.

Само устройство может сделать это (т. Е. Выполнить последовательность отключения / повторного подключения USB).

Вы связались с производителем устройства или, если вы производитель, с EE, который его разработал?

Мне пришлось сделать это, когда я разработал встроенное USB-устройство - программирование можно было выполнить через USB, но устройство должно было иметь возможность отключаться и повторно подключаться в нескольких точках для завершения процесса.

Кроме того, существует метод грубой силы для отключения хост-устройства USB в диспетчере устройств (я предполагаю, что это можно сделать в программном обеспечении), а затем повторно включить его.

По крайней мере, у Phidget есть управляемые через USB релейные платы, которые вы можете использовать для подключения питания или самих USB-линий к концентраторам или отдельным устройствам.

-Адам

Как насчет использования Devcon.exe для «удаления», а затем «повторного сканирования»?

DR

Во-вторых, devcon является частью Windows Driver Kit, и исходный код также предоставляется.

djp 05.06.2010 14:35
devcon requires administrator privileges.
Jason Harrison 10.02.2016 07:43

Некоторое время назад мне пришлось сделать это для моего автомобильного компьютерного проекта. Драйверы сенсорного экрана не любили переходить в спящий режим, и их нужно было повторно подключать, когда компьютер возвращался из спящего режима. В итоге я решил использовать Devcon.exe, как предлагал DigitalRacer. Однако хитрость заключалась в том, что удаление / повторное сканирование на контроллере не работало. Мне пришлось выполнить удаление / повторное сканирование на концентраторе перед устройством (который впоследствии отключил все подключенные устройства).

Вот несколько практических советов:

http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459

Это более хардкорно:

http://support.microsoft.com/kb/311272

Я бы сказал, что использование devcon.exe может решить некоторые проблемы, но не мои. Предположим, что вы можете построить коробку с массивами USB-портов, в которой линия питания прерывается полевыми транзисторами, управляемыми микроконтроллером. MCU должен говорить что-то простое и надежное, например RS-232. Может быть плата Arduino, которая упрощает страшную работу с оборудованием.

Вы можете использовать C# Hardware Helper Lib и добавить Функция ResetDevice.

public bool ResetDevice( IntPtr hDevInfo, IntPtr devInfoData )  
// Need to add  
// public const int DICS_PROPCHANGE = ((0x00000003));   
// at the public class Native under //PARMS  
int szOfPcp;  
IntPtr ptrToPcp;  
int szDevInfoData;  
IntPtr ptrToDevInfoData;  

Native.SP_PROPCHANGE_PARAMS pcp = new Native.SP_PROPCHANGE_PARAMS();  
pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(Native.SP_CLASSINSTALL_HEADER));  
pcp.ClassInstallHeader.InstallFunction = Native.DIF_PROPERTYCHANGE;  
pcp.StateChange = Native.DICS_PROPCHANGE; // for reset  
pcp.Scope = Native.DICS_FLAG_CONFIGSPECIFIC;  
pcp.HwProfile = 0;  

szOfPcp = Marshal.SizeOf(pcp);  
ptrToPcp = Marshal.AllocHGlobal(szOfPcp);  
Marshal.StructureToPtr(pcp, ptrToPcp, true);  
szDevInfoData = Marshal.SizeOf(devInfoData);  
ptrToDevInfoData = Marshal.AllocHGlobal(szDevInfoData);  
Marshal.StructureToPtr(devInfoData, ptrToDevInfoData, true);  

bool rslt1 = Native.SetupDiSetClassInstallParams(hDevInfo, ptrToDevInfoData, ptrToPcp,   Marshal.SizeOf(typeof(Native.SP_PROPCHANGE_PARAMS)));  
bool rstl2 = Native.SetupDiCallClassInstaller(Native.DIF_PROPERTYCHANGE, hDevInfo,   ptrToDevInfoData);  

if (rslt1 && rstl2)  
{  
    return true;  
}  
return false;  
}  

К сожалению, это работает, только если устройство не занято. В противном случае запрашивается перезагрузка.

Sergey Podobry 31.08.2015 16:43

Другие вопросы по теме