2008-09-26 21 views
32

Estoy tratando de arreglar un dispositivo USB no receptivo que se hace pasar por un puerto COM virtual. El replugging manual funciona, pero puede haber hasta 12 de estas unidades. ¿Hay un comando API para hacer el equivalente programático del ciclo de desenchufar/volver a conectar?¿Cómo desconectar y volver a conectar programáticamente un dispositivo USB arbitrario?

+0

posible duplicado de [Retirar con USB-Drive utilizando la API de Win32?] (Http://stackoverflow.com/questions/85649/safe-remove-usb-drive-using-win32-api) –

+0

Software como USB Safely Remove es capaz de volver a conectar el dispositivo USB desenchufado al reiniciar el concentrador USB completo (inluciendo otros dispositivos conectados). –

Respuesta

3

Lamentablemente, no hay ninguno que yo sepa. Desconectando físicamente la conexión USB hace cosas electrónicas específicas con resistencias pullup, de modo que el dispositivo sabe que está desconectado. No he encontrado un host que intente simular esta condición sin desenchufarlo físicamente.

0

Si tiene más de uno de estos en una máquina host en particular, puede ahorrar algo de tiempo/frustración conectándolos a su propio concentrador USB dedicado de la máquina; al menos, es solo un cable para desenchufar/enchufar a reinicia un par de dispositivos a la vez.

Probablemente hayas pensado en eso, por supuesto. :-)

+0

no es una solución de programación, pero seguramente funcionará :) – jop

0

Puede hacerse programáticamente unmounting a USB drive, sin embargo, no sé si el remontaje se puede hacer a través del código.

0

En Eject USB disks using C# (The Code Project) buscar este:

CM_Request_Device_Eject función

Ésta es la función que SETUPAPI expulsa un dispositivo (cualquier dispositivo que pueda ser expulsado ). Se necesita un identificador de instancia dispositivo (o DevInst) como de entrada ...

+1

¿Puede un dispositivo que está "... disfrazado como un puerto de comunicación virtual". ser expulsado? –

1

Como Greg Hewgill Dicho esto, no creo que es posible.

La iniciación de todo el inicio de usb se desencadena por el esclavo USB (en su caso su dispositivo). El host usb (la pc) puede enviar un mensaje al dispositivo para indicarle que se apague, pero una vez que está listo, el dispositivo debe comenzar nuevamente. El anfitrión no puede obligarlo a hacerlo.

Para empeorar las cosas, posiblemente encontrará que el dispositivo usb está detectando el enchufe que está siendo insertado (al detectar el voltaje usb en las líneas eléctricas) para iniciarse. Esto es particularmente cierto para los dispositivos con bus.


Parece que hay diferencias con respecto a su situación y al tratar de desmontar/volver a montar las unidades de disco. Cuando el disco usb se desmonta, no hay ninguna razón para que no pueda seguir enumerado en la pc. En realidad, no estás reiniciando la unidad usb, simplemente haciendo que el sistema de archivos esté inactivo.

1

He examinado esto para realizar pruebas automáticas. La mejor solución que se nos ocurrió parece ser la capacidad de los concentradores USB para desconectar los dispositivos cuando consumen demasiada energía. Desde una perspectiva USB, parece que el host USB puede indicarle a un concentrador que lo haga. Con 12 dispositivos, tendrás centros, por lo que te sugiero que investigues ese camino.

0

Usamos this para desconectar los dispositivos usb programables.

+0

DESCARGO DE RESPONSABILIDAD: No es una solución programática. –

2

Pensamiento: en el Administrador de dispositivos, puede hacer clic con el botón derecho en el ícono de su computadora (la parte superior del árbol de dispositivos) y "buscar cambios".No estoy 100% seguro, pero creo que si "expulsa" un dispositivo USB (software "desconectar" equivalente), luego Buscar cambios de hardware, se mostrará una copia de seguridad aunque nunca salió del puerto.

Si tengo razón al respecto, es posible que pueda usar la clase Microsoft.Win32.Shell para emular la apertura de Panel de control -> Herramientas administrativas -> Administrador de dispositivos y ejecutar el elemento del menú contextual. Vale la pena intentarlo, de todos modos.

0

El dispositivo en sí mismo puede hacer esto (es decir, realizar una secuencia de desconexión/reconexión USB).

¿Ha contactado con el fabricante del dispositivo, o si es el fabricante, con la EE que lo diseñó?

Tuve que hacer esto cuando diseñé un dispositivo USB incorporado: la programación podía realizarse a través de USB, pero el dispositivo tenía que poder desconectarse y reconectarse en varios puntos para completar el proceso.

Además, existe el método de fuerza bruta para deshabilitar el dispositivo host USB en el administrador de dispositivos (supongo que esto se puede hacer en el software) y luego volver a habilitarlo.

Si nada más, Phidget tiene tarjetas de relé controladas por USB que puede usar para conectar la alimentación o las líneas de USB a hubs o dispositivos individuales.

-Adam

8

Qué acerca del uso Devcon.exe de "eliminar" y luego "re-escaneo"?

DR

+1

En segundo lugar, devcon es una parte del Kit de controladores de Windows y también se proporciona la fuente. – djp

+0

[devcon] (https://msdn.microsoft.com/en-us/library/windows/hardware/ff544707 (v = vs.85) .aspx) requiere privilegios de administrador. –

1

que tenía que hacer esto para mi proyecto de la computadora del coche hace un tiempo. A los controladores de pantalla táctil no les gustaba entrar en hibernación y necesitaban volver a conectarse cuando la computadora regresaba de la hibernación. La forma en que terminé resolviéndolo fue usando Devcon.exe como DigitalRacer sugirió. El truco, sin embargo, fue que eliminar/volver a escanear en el controlador no funcionó. Tuve que hacer la eliminación/reexploración en un HUB aguas arriba del dispositivo (que posteriormente desconectó todos los dispositivos conectados).

1

Aquí hay algunas manos en orientación:

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

Esto es más duro:

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

yo diría que el uso de devcon.exe puede resolver algunos problemas, aunque no la mía . Supongamos que puede construir un cuadro con matrices de puertos USB, donde la línea de alimentación se interrumpe con FET controlados por una MCU. La MCU debería hablar algo básico y confiable, como RS-232. Puede haber una placa Arduino que simplifica el trabajo de hardware de miedo.

3

Puede usar el C# Hardware Helper Lib y agregar el 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; 
} 
+0

Desafortunadamente solo funciona si el dispositivo no está ocupado. De lo contrario, solicita un reinicio. –

Cuestiones relacionadas