Как программно отключить и снова подключить произвольное USB-устройство? - PullRequest
34 голосов
/ 26 сентября 2008

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

Ответы [ 13 ]

9 голосов
/ 01 апреля 2009

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

DR

3 голосов
/ 08 января 2013

Вы можете использовать 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;  
}  
3 голосов
/ 26 сентября 2008

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

2 голосов
/ 03 февраля 2009

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

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

1 голос
/ 29 июня 2012

Вот несколько советов:

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

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

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

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

1 голос
/ 15 июня 2009

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

1 голос
/ 26 сентября 2008

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

1 голос
/ 26 сентября 2008

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

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

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


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

0 голосов
/ 03 февраля 2009

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

Обращались ли вы к изготовителю устройства или, если вы производитель, к ЭЭ, которые его разработали?

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

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

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

-Adam

0 голосов
/ 06 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...