2009-05-27 10 views
9

Tôi muốn chu kỳ (mô phỏng rút phích cắm và lắp lại) thiết bị USB (modem) sau khi một sự kiện nhất định đã kích hoạt. Tôi tìm thấy một mẫu trên CodeProject:Làm cách nào để chu trình thiết bị USB từ C#?

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

đó cho phép tôi để xác định + đẩy thiết bị thông qua cáp serial non-volatile của nó, nhưng tôi cần nó để tái chế, không chỉ đẩy.

Tôi đã đọc này:

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

Tôi không hiểu nó.

này đã được đề cập trong bài viết liên quan USB khác:

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

Nó không liên quan đến vấn đề của tôi.

+0

Ý anh là gì bởi rác? Bạn có nghĩa là khởi động lại mềm không? Hoặc bạn có nghĩa là "di chuyển nó vào thùng rác"? – Randolpho

+0

khởi động lại, giống như xóa thiết bị và lắp lại thiết bị. – callisto

+0

Xem câu trả lời của tôi cho vấn đề này bên dưới – callisto

Trả lời

12

Làm cho nó hoạt động bằng cách sử dụng một công cụ dòng lệnh gọi là devcon, mà sau đó tôi gọi từ mã.

Giảm devcon.exe vào một trong các đường dẫn hệ thống để nó hoạt động ở mọi nơi.

Devcon: devcon

gọi: DevCon Remove * usb "* MI_01"

sau đó được gọi là: DevCon rescan

mã:

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

Sẽ rất tốt nếu bạn có thể thêm liên kết vào devcon và một số mã ví dụ để những người khác có thể tìm hiểu. – Kinlan

+1

devcon tại http://support.microsoft.com/kb/311272 – callisto

+0

Tôi đã có một thiết bị (điều khiển màn hình cảm ứng) mà tôi đã làm một cái gì đó tương tự với, nhưng tôi thực sự đã phải loại bỏ/rescan trên HUB cho nó để làm việc. Nó có thể là một trung tâm crappy, 9 và nó chắc chắn là một trình điều khiển crappy) nhưng loại bỏ trên thiết bị vẫn còn lại nó được hỗ trợ, và loại bỏ các trung tâm thực sự cắt điện. – Dolphin

3

Bạn có thể sử dụng C# Hardware Helper Lib và thêm số ResetDevice function.

Chỉ cần chắc chắn bạn thêm

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

tại public class Native dưới // 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; 
}