Odpowiedz 
 
Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
STM32 USB/CDC
SP9RQA Offline
Krzysztof
****

Liczba postów: 370
Dołączył: 30-09-2009
Post: #1
STM32 USB/CDC
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
(Ten post był ostatnio modyfikowany: 06-04-2017 21:14 przez SP9RQA.)
06-04-2017 21:14
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
STM32 USB/CDC - SP9RQA - 06-04-2017 21:14
RE: STM32 USB/CDC - SQ8MVY - 06-04-2017, 21:34
RE: STM32 USB/CDC - SP9RQA - 06-04-2017, 21:56
RE: STM32 USB/CDC - SQ8MVY - 06-04-2017, 22:11
RE: STM32 USB/CDC - SP9RQA - 06-04-2017, 22:21
RE: STM32 USB/CDC - SQ8MVY - 06-04-2017, 22:51
RE: STM32 USB/CDC - SP9RQA - 07-04-2017, 14:21
RE: STM32 USB/CDC - SQ8MVY - 07-04-2017, 15:42
RE: STM32 USB/CDC - SP9RQA - 07-04-2017, 16:30
RE: STM32 USB/CDC - SQ8MVY - 07-04-2017, 20:36
RE: STM32 USB/CDC - SP9RQA - 09-04-2017, 11:23
RE: STM32 USB/CDC - SQ8MVY - 09-04-2017, 14:41
RE: STM32 USB/CDC - SP9RQA - 09-04-2017, 14:48
RE: STM32 USB/CDC - SQ8MVY - 09-04-2017, 16:51
RE: STM32 USB/CDC - SP9RQA - 09-04-2017, 17:53
RE: STM32 USB/CDC - SQ8MVY - 09-04-2017, 21:32
RE: STM32 USB/CDC - SP3GO - 30-11-2017, 11:54

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości