2008-09-26 18 views
32

Próbuję naprawić niereagujące urządzenie USB, które podszywa się pod wirtualny port COM. Ręczne ponowne podłączanie działa, ale może być do 12 takich urządzeń. Czy istnieje polecenie API, aby wykonać programowy odpowiednik cyklu odłączenia/ponownego podłączenia?Jak programowo odłączyć i odłączyć dowolne urządzenie USB?

+0

możliwe duplikat [Safe wyjąć napęd USB za pomocą Win32 API?] (Http://stackoverflow.com/questions/85649/safe-remove-usb-drive-using-win32-api) –

+0

Software jak Bezpieczne usuwanie USB umożliwia ponowne podłączenie odłączonego urządzenia USB poprzez ponowne uruchomienie całego koncentratora USB (włożenie innych podłączonych urządzeń). –

Odpowiedz

3

Niestety, nie ma takiego, który znam. Fizyczne odłączenie połączenia USB powoduje określone rzeczy elektroniczne z rezystorami pullup, tak że urządzenie wie, że jest odłączone. Nie spotkałem hosta, który próbowałby symulować ten stan bez fizycznego odłączania.

0

Jeśli posiadasz więcej niż jeden z nich na dowolnym komputerze głównym, możesz zaoszczędzić trochę czasu/frustracji przez podłączenie ich do własnego dedykowanego huba USB z urządzenia - przynajmniej jeden kabel do odłączenia/podłączenia uruchom ponownie kilka urządzeń naraz.

Prawdopodobnie pomyślałeś o tym, oczywiście. :-)

+0

nie jest rozwiązaniem do programowania, ale na pewno zadziała :) – jop

0

W Eject USB disks using C# (The Code Project) wygląda na to:

CM_Request_Device_Eject funkcji

to funkcja SetupAPI że wysuwa urządzenie (każde urządzenie, które może być wyrzucana ). Zajmuje urządzenie instancji uchwyt (lub devInst) jako wejścia ...

+1

Czy urządzenie, które "... podszywa się pod wirtualny port". wyskoczyć? –

1

Greg Hewgill Jak powiedział, nie sądzę, że jest to możliwe.

Inicjacja całego uruchomienia usb jest wyzwalana przez usb slave (w twoim przypadku twoje urządzenie). Host usb (komputer) może wysłać wiadomość do urządzenia, aby powiadomić ją o zamknięciu, ale kiedy już to zrobi, to od urządzenia wymaga ponownego uruchomienia. Host nie może tego zmusić.

Na domiar złego prawdopodobnie okaże się, że urządzenie usb wykrywa włożenie wtyczki (przez wykrycie napięcia USB na liniach zasilających), aby uruchomić. Dotyczy to szczególnie urządzeń zasilanych z magistrali.


Wygląda na to, że różnią się one od sytuacji i od próby odmontowania/ponownego zamontowania napędów USB. Kiedy dysk USB jest odmontowany, nie ma powodu, że nie może pozostać wyliczony na PC. W rzeczywistości nie zajmujesz się ponownym instalowaniem napędu USB, tylko czynisz system plików nieaktywnym.

1

Przyjrzałem się temu testom automatycznym. Najlepszym rozwiązaniem, jakie wymyśliliśmy, jest zdolność koncentratorów USB do odłączania urządzeń, gdy pobierają zbyt dużo mocy. Z USB pserspective wygląda na to, że host USB może polecić hubowi, aby to zrobił. Na 12 urządzeniach będziesz mieć huby, więc chciałbym zbadać tę ścieżkę.

0

Użyliśmy this do programowalnego odłączania urządzeń USB.

+0

OŚWIADCZENIE: To nie jest programowe rozwiązanie. –

2

Myśl: w Menedżerze urządzeń można kliknąć prawym przyciskiem myszy ikonę komputera (u góry drzewa urządzeń) i "wyszukać zmiany".Nie jestem w 100% pewny, ale myślę, że jeśli "wysuniesz" urządzenie USB (ekwiwalent "odłączania oprogramowania"), a następnie "Skanuj zmiany sprzętowe", będzie ono wyświetlane, nawet jeśli nigdy nie opuściło portu.

Jeśli mam rację, może być możliwe użycie klasy Microsoft.Win32.Shell do emulowania otwierania Panelu sterowania -> Narzędzia administracyjne -> Menedżer urządzeń i uruchamiania elementu menu kontekstowego. W każdym razie warto spróbować.

0

Sam urządzenie może być w stanie to zrobić (tj. Wykonać sekwencję rozłączania/ponownego połączenia USB).

Czy skontaktowałeś się z producentem urządzenia lub producentem, który zaprojektował EE?

Musiałem to zrobić, kiedy zaprojektowałem urządzenie wbudowane w USB - programowanie można było wykonać przez USB, ale urządzenie musiało być w stanie rozłączyć się i połączyć ponownie w kilku punktach, aby zakończyć proces.

Poza tym istnieje metoda brutalnej siły wyłączania urządzenia hosta USB w menedżerze urządzeń (zakładam, że można to zrobić w oprogramowaniu), a następnie ponownie włączam.

Jeśli nic więcej, Phidget ma kontrolowane przez USB karty przekaźnikowe, których można użyć do podłączenia zasilania lub samych linii USB do koncentratorów lub poszczególnych urządzeń.

-Adam

8

Co na temat korzystania DevCon.exe aby "usunąć", a następnie "rescan"?

DR

+1

Po drugie, devcon jest częścią zestawu Windows Driver Kit i dostarczane jest również źródło. – djp

+0

[devcon] (https://msdn.microsoft.com/en-us/library/windows/hardware/ff544707 (v = vs.85) .aspx) wymaga uprawnień administratora. –

1

Musiałem to zrobić dla mojego projektu komputerowego samochodu jakiś czas temu. Sterowniki ekranu dotykowego nie lubiły przechodzić w stan hibernacji i musiały zostać ponownie podłączone, gdy komputer powrócił ze stanu hibernacji. Sposób w jaki rozwiązałem to użycie Devcon.exe, jak sugerował DigitalRacer. Problem polegał jednak na tym, że polecenie "usuń/skanuj" na kontrolerze nie działa. Musiałem wykonać usuwanie/ponowne skanowanie na HUBu przed urządzeniem (które następnie rozłączyło wszystkie podłączone urządzenia).

1

Oto kilka wskazówek na ręce:

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

To więcej Hardcore:

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

Powiedziałbym, że za pomocą DevCon.exe może rozwiązać pewne problemy, choć nie moje . Załóżmy, że możesz zbudować skrzynkę z tablicami portów USB, gdzie linia zasilania jest przerywana przez kontrolery FET kontrolowane przez MCU. MCU powinien mówić coś podstawowego i niezawodnego, jak RS-232. Może istnieć tablica arduino, która upraszcza przerażającą pracę sprzętu.

3

Możesz użyć C# Hardware Helper Lib i dodać 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

Niestety działa tylko wtedy, gdy urządzenie nie jest zajęte. W przeciwnym razie prosi o ponowne uruchomienie. –

Powiązane problemy