No to ja podam gotowe rozwiązanie
Nie jest ono takie trywialne, bo trochę czasu na to zmarnowałem, ale działa tak, jak powinno. U mnie na STM32F103C8, ale proszę o potwierdzenie, czy u Was też.
Zmiany trzeba zrobić w dwóch plikach HAL dla USB - tych generowanych automatycznie przez CubeMX - oczywiście zmiany wprowadzamy tylko w sekcjach "USER...", a więc pozostaną nawet po zmianie konfiguracji sprzętu.
Zmienione pliki dostępne są
TUTAJ (nie działa dodawanie pliku przy odpowiedzi na sp-hm), a poniżej lista numerów linii, które zostały dodane:
usbd_cdc_if.c:
107-108, 135-138, 166, 235, 239-246, 250
usbd_cdc_if.h:
118
Po takich zmianach wystarczy użyć funkcji "USBD_CDC_IsPortOpen()".
Zwróci ona 0 jeśli wystąpiło którekolwiek ze zdarzeń:
- nie włożono wtyczki USB do PC;
- włożono wtyczkę USB, ale nie otwarto portu;
- włożono wtyczkę USB, otwarto port, a następnie wyciągnięto wtyczkę (zerwane połączenie);
- zamknięto wcześniej otwarty port;
Funkcja zwróci 1 tylko jeśli mamy prawidłowe połączenie i port jest otwarty.
Całość rozpracowywałem mając włączony USB w przykładowym projekcie oraz jednocześnie robiąc "debug" na konsoli podpiętej po BT na USART2.
Próbowałem wszelkich (tak mi się wydaje) kombinacji z otwieraniem/zamykaniem portu i wkładaniem/wyciąganiem wtyczki USB, więc powinno być OK.
Jeśli ktoś zauważy problem, to proszę o raport
Pozdrawiam,
Rafał SP3GO