c++ - una - no se reconoce el dispositivo usb windows 7
¿Cómo desconectar y volver a conectar programáticamente un dispositivo USB arbitrario? (13)
¿Qué hay de usar Devcon.exe para "eliminar" y luego "volver a examinar"?
DR
Estoy tratando de arreglar un dispositivo USB no sensible 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?
Aquí hay algunas manos en la orientación:
http://digital.ni.com/public.nsf/allkb/1D120A90884C25AF862573A700602459
Esto es más hardcore:
http://support.microsoft.com/kb/311272
Yo diría que usar devcon.exe puede resolver algunos problemas, aunque no los míos. 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.
Como dijo Greg Hewgill , no creo que sea 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, es muy probable que el dispositivo USB detecte el enchufe que se está insertando (al detectar el voltaje USB en las líneas de alimentación) para que se inicie. Esto es particularmente cierto para los dispositivos con bus.
Parece que hay diferencias con respecto a su situación y el caso de tratar de desmontar / volver a montar unidades USB. 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.
Desafortunadamente, no hay uno 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.
El dispositivo en sí mismo puede hacer esto (es decir, realizar una secuencia de desconexión / reconexión USB).
¿Ha contactado al fabricante del dispositivo, o si usted es el fabricante, las EE que lo diseñaron?
Tuve que hacer esto cuando diseñé un dispositivo USB incorporado: la programación podía realizarse a través del USB, pero el dispositivo tenía que ser capaz de desconectarse y reconectarse en varios puntos para completar el proceso.
Más allá de eso, está 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 placas de retransmisión controladas por USB que puede usar para conectar la alimentación o las líneas de USB a concentradores o dispositivos individuales.
-Adán
En Expulsar discos USB usando C # ( The Code Project ) busque esto:
Función CM_Request_Device_Eject
Esta es la función SetupApi que expulsa un dispositivo (cualquier dispositivo que pueda ser expulsado). Se necesita un identificador de instancia del dispositivo (o devInst) como entrada ...
Hace un tiempo tuve que hacer esto para el proyecto de mi computadora para el automóvil. 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).
He visto esto para pruebas automatizadas. 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.
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 utilizar 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.
Puede usar el C # Hardware Helper Lib y agregar la función 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;
}
Se puede realizar el desmontaje mediante programación de una unidad USB , sin embargo, no sé si la remontada se puede realizar a través de un código.
Si tiene más de uno de estos en una máquina host en particular, puede ahorrar algo de tiempo / frustración enchufándolos en su propio concentrador USB dedicado de la máquina; al menos, es solo un cable para desenchufar / enchufar para reiniciar un par de dispositivos a la vez.
Probablemente hayas pensado en eso, por supuesto. :-)
Usamos this para desconectar los dispositivos usb programables.