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?
Odpowiedz
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.
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. :-)
nie jest rozwiązaniem do programowania, ale na pewno zadziała :) – jop
Programowo unmounting a USB drive można zrobić, jednak nie wiem, czy ponowne wykonanie może być wykonane za pomocą kodu.
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 ...
Czy urządzenie, które "... podszywa się pod wirtualny port". wyskoczyć? –
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.
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ę.
Użyliśmy this do programowalnego odłączania urządzeń USB.
OŚWIADCZENIE: To nie jest programowe rozwiązanie. –
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ć.
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
Co na temat korzystania DevCon.exe aby "usunąć", a następnie "rescan"?
DR
Po drugie, devcon jest częścią zestawu Windows Driver Kit i dostarczane jest również źródło. – djp
[devcon] (https://msdn.microsoft.com/en-us/library/windows/hardware/ff544707 (v = vs.85) .aspx) wymaga uprawnień administratora. –
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).
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.
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;
}
Niestety działa tylko wtedy, gdy urządzenie nie jest zajęte. W przeciwnym razie prosi o ponowne uruchomienie. –
- 1. Programowo odłączyć połączenie sieciowe
- 2. Programowo "odłączyć i ponownie podłączyć" urządzenie USB, aby załadować nowy sterownik w systemie OS X?
- 3. Jak odłączyć projekt?
- 4. Jak odłączyć połączenie Git?
- 5. Programowo podłącz i odłącz urządzenie z Androidem
- 6. Nie można odłączyć sesji ekranu
- 7. SignalR podłączyć/odłączyć koncentrator wysadza
- 8. SignalR - Autoryzacja OnConnect() - jak odłączyć nieautoryzowanego użytkownika?
- 9. jak odłączyć naprzemiennie po kliencie git - referencje?
- 10. Jak odłączyć proces potomny w skrypcie Node.js?
- 11. Jak odłączyć popup JavaScript z otwieraczem
- 12. Jak odłączyć zachowanie w Symfony/Doctrine?
- 13. Programowalne podłączanie i odłączanie urządzeń USB
- 14. Czy istnieje jakaś poprawka dla urządzenia testowego Android odłączyć urządzenie testowe w Macbook Pro?
- 15. Kiedy odłączyć lub dołączyć do wątku doładowania?
- 16. odłączyć jeden proces z visual studio debugger
- 17. AVAudioEngine wywala kiedy odłączyć słuchawki podczas rozmowy
- 18. npm - Błąd: EPERM: Operacja niedozwolona, odłączyć
- 19. Usunąć (odłączyć) pliki pasujące do wyrażeń regularnych
- 20. Czy mogę odłączyć obiekt od sesji NHibernate?
- 21. Pobierz std :: thread, aby się odłączyć i zakończyć samoczynnie
- 22. Jak mogę "odłączyć" SqlDataReader od jego obiektu SqlConnection?
- 23. Jak odłączyć program testowy Java w punktach przerwania Eclipse?
- 24. Jak odłączyć nazwy plików systemu Windows w języku Java?
- 25. Jak odłączyć klawiaturę w UISearchController podczas zmiany ostrości w TVO?
- 26. Jak odłączyć obraz tła w przekrzywionej warstwie (CSS)?
- 27. Jak odłączyć zewnętrzne wydarzenie, gdy kontroler/$ scope zostanie zniszczony?
- 28. Jak mogę odłączyć odniesienie do obiektu w MemoryCache?
- 29. jak odłączyć proces sidekiq raz uruchomiony w terminalu
- 30. Jak mogę odłączyć wektory pasujące do ich nazw kolumn?
możliwe duplikat [Safe wyjąć napęd USB za pomocą Win32 API?] (Http://stackoverflow.com/questions/85649/safe-remove-usb-drive-using-win32-api) –
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ń). –