2008-09-26 4 views
32

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

+0

возможно дубликат [Безопасное извлечение USB-накопитель с помощью Win32 API?] (Http://stackoverflow.com/questions/85649/safe-remove-usb-drive-using-win32-api) – 2012-01-15 08:00:42

+0

Программного обеспечения, как USB Safely Remove позволяет повторно отключить USB-устройство, отключив USB-концентратор (подключая другие подключенные устройства). – 2015-03-20 21:41:00

ответ

3

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

0

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

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

+0

не является программным решением, но он, безусловно, будет работать :) – jop 2008-09-26 09:14:46

0

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

0

В Eject USB disks using C# (The Code Project) ищет это:

CM_Request_Device_Eject функции

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

+1

Может ли устройство, которое «... маскируется как виртуальный COM-порт». быть выброшенным? – 2008-09-27 00:30:02

1

Greg Hewgill Как уже сказал, я не думаю, что это возможно.

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

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

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

1

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

0

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

+0

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это не программное решение. – 2016-06-16 11:33:43

2

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

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

0

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

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

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

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

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

-Adam

8

Что об использовании DevCon.exe "убрать", а затем "повторное сканирование"?

DR

+1

Во-вторых, devcon является частью набора драйверов для Windows, и источник также предоставляется. – djp 2010-06-05 10:35:27

1

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

1

Вот некоторые руки на руководство:

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

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

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

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

3

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

 Смежные вопросы

  • Нет связанных вопросов^_^