Forum: Mikrocontroller und Digitale Elektronik STM32 virtual COM-Port via USB, Abfrage ob auf PC geöffnet


von Flunder (flunder)


Lesenswert?

Ich habe hier ein STM32F407G-DISC1 Evalboard (mit STM32F407VGT6 drauf). 
Das programmiere ich mit Hilfe von STM32CubeMX und STM32CubeIDE.

Der USB_OTG_FS ist als Full Speed (12 MBit/S) Device konfiguriert.
Darauf setzt die USB_DEVICE Middleware auf.

Ich mag damit (Debug-)Ausgaben auf einen virtuellen COM-Port machen. 
Nachdem erstmal relativ viel funktioniert (die Ausgaben kommen bei 
meinem Terminalprogramm an), musste ich feststellen, dass ohne auf dem 
PC geöffneten COM-Port alles ins Stocken gerät, da CDC_TransmitCplt_FS 
(Data transmitted callback) nicht mehr aufgerufen wird, und ich mir die 
Beine in den Bauch warte, dass meine Puffer wieder frei werden.

Meine Frage ist also : Wie kann ich im Programm feststellen, ob ein 
Programm auf dem PC meinen virtuellen COM-Port geöffnet hat oder nicht ?
Wenn es niemanden interessiert, kann ich mir ja sogar die ganzen 
Ausgaben sparen.

von Dirk B. (garag)


Lesenswert?

Wie wäre es mit einem Sendepuffer. Die Daten erst in einen Puffer 
schreiben und wenn der voll ist, die Daten verwerfen.
USB dann aus dem Puffer füttern.

von Zino (zinn)


Lesenswert?

Flunder schrieb:
> Meine Frage ist also : Wie kann ich im Programm feststellen, ob ein
> Programm auf dem PC meinen virtuellen COM-Port geöffnet hat oder nicht ?

Das reicht nicht. Das Programm, das den virtuellen COM-Port geöffnet 
hat, muß auch genug davon lesen. Und ob das Programm dazu gewillt ist 
und fürderhin auch gewillt sein wird, kannst Du natürlich nicht 
feststellen.

Du kannst nur feststellen, ob der Gerätetreiber willens ist:

  if(hUsbDeviceFS.dev_state==USBD_STATE_CONFIGURED)

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Das hatten wir hier schon mal ausführlich diskutiert... Das Ergebnis: Es 
geht im Endeffekt nicht. Du kannst nur prüfen ob der Puffer voll ist 
(weil er nicht abgeholt wird) und dann ggf. halt gar nicht senden 
(wodurch die Daten verloren gehen). Blöd ist halt dass dann uralte Daten 
im USB-Hardware-Puffer herumoxidieren und dann als erstes am PC 
ankommen, wenn man dann die Daten abholt.

Man könnte die Flusskontroll-Nachrichten missbrauchen um die 
Debug-Nachrichten explizit zu aktivieren.

: Bearbeitet durch User
von Flunder (flunder)


Lesenswert?

Das war zwar nicht das, auf was ich gehofft habe, aber ich habe mich 
jetzt damit abgefunden und werte DSR aus. Danke für die Infos.

von Ada J. Quiroz (inschnier)


Lesenswert?

Flunder schrieb:
> Das war zwar nicht das, auf was ich gehofft habe, aber ich habe
> mich
> jetzt damit abgefunden und werte DSR aus. Danke für die Infos.

Ich habe zumindest VUSB an einen GPIO geführt womit ich erkennen kann, 
ob ein USB Kabel angeschlossen ist.

Beitrag #7653827 wurde vom Autor gelöscht.
von Johnny B. (johnnyb)


Lesenswert?

Ada J. Quiroz schrieb:
> Ich habe zumindest VUSB an einen GPIO geführt womit ich erkennen kann,
> ob ein USB Kabel angeschlossen ist.

Na, anstelle dessen würde ich das so abfragen:
if (hUsbDeviceFS.dev_state == USBD_STATE_CONFIGURED) ...

Dann weisst Du sogar, ob ein richtiger Host angeschlossen ist. Das steht 
übrigens auch schon etwas weiter oben in diesem Thread.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.