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

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


person Community    schedule 26.09.2008    source источник
comment
возможный дубликат Безопасное извлечение USB-накопителя с помощью Win32 API?   -  person Cody Gray    schedule 15.01.2012
comment
Программное обеспечение, такое как USB Safely Remove, может повторно подключить отключенное USB-устройство, перезапустив весь USB-концентратор (включая другие подключенные устройства).   -  person Ondrej Galbavý    schedule 21.03.2015


Ответы (13)


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

DR

person Community    schedule 01.04.2009
comment
Во-вторых, devcon является частью Windows Driver Kit, и исходный код также предоставляется. - person djp; 05.06.2010
comment
devcon требует администратора привилегии. - person Jason Harrison; 10.02.2016

Вы можете использовать C # Hardware Helper Lib и добавить ResetDevice function.

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;  
}  
person shahar_m    schedule 08.01.2013
comment
К сожалению, это работает, только если устройство не занято. В противном случае запрашивается перезагрузка. - person Sergey Podobry; 31.08.2015

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

person Greg Hewgill    schedule 26.09.2008

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

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

person Coderer    schedule 03.02.2009

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

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

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


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

person Andrew Edgecombe    schedule 26.09.2008

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

person MSalters    schedule 26.09.2008

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

person Dolphin    schedule 15.06.2009

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

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

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

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

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

person NoJoshua    schedule 29.06.2012

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

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

person robsoft    schedule 26.09.2008

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

person Ilya    schedule 06.10.2008
comment
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: это не программное решение. - person lahjaton_j; 16.06.2016

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

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

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

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

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

-Адам

person Adam Davis    schedule 03.02.2009

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

person jop    schedule 26.09.2008

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

CM_Request_Device_Eject функция

Это функция SetupApi, которая выталкивает устройство (любое устройство, которое может быть выброшено). В качестве входных данных он принимает дескриптор экземпляра устройства (или devInst) ...

person Treb    schedule 26.09.2008
comment
Может устройство, которое ... маскируется под виртуальный com-порт. быть изгнанным? - person Andrew Edgecombe; 27.09.2008