2009-05-27 13 views
9

Vorrei fare un ciclo (simula scollegare e reinserire) un dispositivo USB (modem) dopo che un determinato evento è stato attivato. Ho trovato un campione su CodeProject:Come posso far passare un dispositivo USB da C#?

http://www.codeproject.com/KB/system/usbeject.aspx

che mi permette di identificare + espellere il dispositivo tramite il suo serial non volatile, ma ho bisogno di riciclare, non solo espellere.

Ho letto questo:

http://www.tech-archive.net/Archive/Development/microsoft.public.development.device.drivers/2005-02/1292.html

io non lo capisco.

Questo è stato detto in altre Related Posts USB:

http://www.codeproject.com/KB/system/DriveDetector.aspx

Non è rilevante per il mio problema.

+0

Che cosa si intende per riciclare? Intendi un riavvio morbido? O intendi "spostalo nel cestino"? – Randolpho

+0

riavvia, come rimuovere il dispositivo e reinserirlo. – callisto

+0

Vedere la mia risposta a questo problema sotto – callisto

risposta

12

Ho funzionato usando uno strumento da riga di comando chiamato devcon, che ho poi chiamato dal codice.

Droppato devcon.exe in uno dei percorsi di sistema in modo che funzioni ovunque.

Devcon: devcon

chiamato: DEVCON rimuovere * usb "* MI_01"

poi chiamato: DEVCON riesamina

codice:

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo.FileName = "DEVCON"; 
proc.StartInfo.Arguments = "Remove *usb"*MI_01"; 
proc.StartInfo.RedirectStandardError = true; 
proc.StartInfo.RedirectStandardOutput = true; 
proc.StartInfo.UseShellExecute = false; 
proc.Start(); 
+1

Sarebbe positivo se fosse possibile aggiungere un collegamento a devcon e codice di esempio in modo che altre persone possano apprendere. – Kinlan

+1

devcon all'indirizzo http://support.microsoft.com/kb/311272 – callisto

+0

Avevo un dispositivo (controller touchscreen) con cui ho fatto qualcosa di simile, ma in realtà ho dovuto rimuovere/rescan sull'HUB per farlo funzionare. Potrebbe essere stato un hub schifoso, 9 ed era sicuramente un driver schifoso, ma la rimozione sul dispositivo continuava a essere alimentata, e la rimozione dell'hub ha effettivamente ridotto la potenza. – Dolphin

3

È possibile utilizzare la C# Hardware Helper Lib e aggiungere il ResetDevice function.

Basta fare in modo di aggiungere

public const int DICS_PROPCHANGE = ((0x00000003)); 

al public class Native sotto // PARMS,

public bool ResetDevice(IntPtr hDevInfo, IntPtr devInfoData) 
{ 
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; 
} 
Problemi correlati