Koleżankom i Kolegom Radioamatorom, Krótkofalowcom,
Konstruktorom i Waszym Rodzinom – w tych trudnych czasach –
po dotkliwej awarii naszego forum
Pogodnego czasu po Bożym Narodzeniu,
Dosiego Nowego Roku
oraz Radosnych Trzech Króli

Życzy Zespół Home Made

Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
STM32 USB/CDC
#1
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
Odpowiedz


Wiadomości w tym wątku
STM32 USB/CDC - przez SP9RQA - 06-04-2017, 20:14

Skocz do:


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