Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

DR

Ответ 2

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

Ответ 3

Вы можете использовать С# 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;  
}  

Ответ 4

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

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

Ответ 5

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

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

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


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

Ответ 6

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

Ответ 7

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

Ответ 8

Вот некоторые рекомендации:

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

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

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

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

Ответ 9

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

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

Ответ 11

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

Функция CM_Request_Device_Eject

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

Ответ 12

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

Ответ 13

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

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

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

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

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

-Adam