Я пытаюсь исправить невосприимчивое USB-устройство, маскирующееся под виртуальный COM-порт. Ручное подключение работает, но их может быть до 12 штук. Есть ли команда API для выполнения программного эквивалента цикла отключения / повторного подключения?
Как программно отключить и снова подключить произвольное USB-устройство?
Ответы (13)
Как насчет использования Devcon.exe для «удаления», а затем «повторного сканирования»?
DR
Вы можете использовать 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;
}
К сожалению, я не знаю ни одного. Физическое отключение USB-соединения приводит к определенным электронным функциям с подтягивающими резисторами, так что устройство знает, что оно отключено. Я не встречал хоста, который пытался бы смоделировать это состояние без физического отключения.
Мысль: в Диспетчере устройств вы можете щелкнуть правой кнопкой мыши значок своего компьютера (вверху дерева устройств) и «выполнить поиск изменений». Я не уверен на 100%, но я думаю, что если вы «извлечете» USB-устройство (эквивалент программного «отсоединения»), а затем выполните сканирование на предмет изменений оборудования, оно отобразится в резервной копии, даже если оно на самом деле никогда не покидало порт.
Если я прав насчет этого, вы можете использовать класс Microsoft.Win32.Shell для имитации открытия Панели управления -> Администрирование -> Диспетчер устройств и запуска пункта контекстного меню. В любом случае стоит попробовать.
Как сказал Грег Хьюгилл, я не Не думаю, что это возможно.
Инициирование всего запуска usb запускается ведомым устройством usb (в вашем случае вашим устройством). Узел USB (ПК) может отправить устройству сообщение, чтобы оно отключилось, но как только это будет сделано, устройство должно снова запустить резервное копирование. Хозяин не может заставить это сделать.
Что еще хуже, вы, вполне возможно, обнаружите, что устройство USB определяет вставляемую вилку (путем определения напряжения USB на линиях электропередач) для запуска. Это особенно верно для устройств с питанием от шины.
Похоже, есть отличия от вашей ситуации и от случая попытки размонтировать / перемонтировать USB-накопители. Когда USB-накопитель отключен, нет причин, по которым он не может оставаться в списке на компьютере. На самом деле вы не сбрасываете USB-накопитель, а просто делаете его файловую систему неактивной.
Я посмотрел на это для автоматизированных тестов. Лучшее решение, которое мы придумали, - это возможность USB-концентраторов отключать устройства, когда они потребляют слишком много энергии. С точки зрения USB, похоже, что хост USB может дать команду концентратору сделать это. С 12 устройствами у вас будут концентраторы, поэтому я предлагаю изучить этот путь.
Некоторое время назад мне пришлось сделать это для моего автомобильного компьютерного проекта. Драйверы сенсорного экрана не любили переходить в спящий режим, и их нужно было повторно подключать, когда компьютер возвращался из спящего режима. В итоге я решил использовать Devcon.exe, как предлагал DigitalRacer. Однако хитрость заключалась в том, что удаление / повторное сканирование на контроллере не работало. Мне пришлось выполнить удаление / повторное сканирование на концентраторе перед устройством (который впоследствии отключил все подключенные устройства).
Вот несколько практических советов:
http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459
Это более хардкорно:
http://support.microsoft.com/kb/311272
Я бы сказал, что использование devcon.exe может решить некоторые проблемы, но не мои. Предположим, что вы можете построить коробку с массивами USB-портов, в которой линия питания прерывается полевыми транзисторами, управляемыми микроконтроллером. MCU должен говорить что-то простое и надежное, например RS-232. Может быть плата Arduino, которая упрощает страшную работу с оборудованием.
Если у вас более одного из них на каком-либо конкретном хост-компьютере, вы можете сэкономить время / нервы, подключив их к их собственному выделенному USB-концентратору, выходящему из машины - по крайней мере, это только один кабель, который нужно отключить / подключить, чтобы перезапустить пару устройств одновременно.
Вы, наверное, думали об этом. :-)
Мы использовали this для программируемого отключения USB-устройств.
Само устройство может сделать это (т. Е. Выполнить последовательность отключения / повторного подключения USB).
Вы связались с производителем устройства или, если вы производитель, с EE, который его разработал?
Мне пришлось сделать это, когда я разработал встроенное USB-устройство - программирование могло быть выполнено через USB, но устройство должно было иметь возможность отключаться и повторно подключаться в нескольких точках для завершения процесса.
Кроме того, существует метод грубой силы для отключения хост-устройства USB в диспетчере устройств (я предполагаю, что это можно сделать в программном обеспечении), а затем повторно включить его.
По крайней мере, у Phidget есть управляемые через USB релейные платы, которые вы можете использовать для подключения питания или самих USB-линий к концентраторам или отдельным устройствам.
-Адам
Программно отключить USB-накопитель можно, однако я не Не знаю, можно ли перемонтировать с помощью кода.
В Извлечение USB-дисков с помощью C # (Проект кода) найдите это:
CM_Request_Device_Eject функция
Это функция SetupApi, которая выталкивает устройство (любое устройство, которое может быть выброшено). В качестве входных данных он принимает дескриптор экземпляра устройства (или devInst) ...