Witam.
Może ktoś będzie wiedział jak rozwiązać pewien mały problem z obsługą USB.
Otóż na urządzenie szeregowe można wysłać string za pomocą funkcji:
Kod:
CDC_Transmit_FS(... , ...);
[/code]
i to działa, ale pod warunkiem, że takich operacji nie robię jedna za drugą,
czyli:
Kod:
CDC_Transmit_FS(... , ...);
CDC_Transmit_FS(... , ...);
CDC_Transmit_FS(... , ...);
wtedy wysyła mi się jedynie ta pierwsza. Nie jest to jakiś problem, bo można dać po każdej z nich:
HAL_Delay();
i już jest dobrze, choć mało elegancko.
Funkcja może zwracać 3 wartości OK, BUSY, FAIL które można wykorzystać
choćby w ten sposób:
Kod:
while (CDC_Transmit_FS(... , ...) != USBD_OK);
i to też działa, ale ... no właśnie, chodzi o to ale ;-)
Działa dopóki po stronie PC jest otwarty port. Z chwilą jego zamknięcia program stoi na tej linii programu. Oczywiście można zrobić jakiś timeout i po chwili zrezygnować z wysyłania, ale to też niepotrzebna strata czasu.
Jak wobec tego wykryć otwarcie/zamknięcie portu po stronie PC?
Jest to moje pierwsze starcie z STM32. Projekt jako taki wygenerowałem przy pomocy MXCube i tam jest inicjalizacja CDC zrobiona z automatu. Ona działa raczej poprawnie, bo przy otwartym porcie leci wszystko to co ma lecieć, kłopot pojawił się w momencie jak zamykam port wtedy program się zatrzymuje na najbliższym komunikacie, który ma lecieć po CDC.
Przeczesałem już sieć w poszukiwaniu rozwiązania i znalazłem coś takiego:
http://stackoverflow.com/questions/53388...ort-device
ale coś mi to nie chce zaskoczyć.
Wykopiowałem z tamtego przykładu fragment:
Kod:
if ((hUsbDevice_0->dev_state != USBD_STATE_CONFIGURED)
|| (hUsbDevice_0->ep0_state == USBD_EP0_STATUS_IN))
i włożyłem do swojego, gdzie stan portu staram się wyświetlić na LCD:
Kod:
if ((hUsbDeviceFS.dev_state != USBD_STATE_CONFIGURED)
|| (hUsbDeviceFS.ep0_state == USBD_EP0_STATUS_IN))
{
LCD_SetLocation(&lcd, 0, 1);
LCD_WriteString(&lcd, "Blad USB");
LCD_SetLocation(&lcd, 6, 1);
LCD_WriteString(&lcd, buffer);
}
else
{
LCD_SetLocation(&lcd, 0, 1);
LCD_WriteString(&lcd, "USB OK");
LCD_SetLocation(&lcd, 6, 1);
LCD_WriteString(&lcd, buffer);
}
ale jak można się spodziewać, cały czas mam "Blad USB". Więc coś pewnie dalej źle robię.
Krzysiek