STM32 VCP - Daten vom PC empfangen

Ich verwende die STM32 HAL VCP-Firmware, die von CubeMX auf dem STM32F4 Discovery Board generiert wurde. Der Virtual COM Port funktioniert, ich kann beliebig viele Nachrichten vom Mikrocontroller zum PC übertragen. Aber in der anderen Richtung, vom PC zum Mikrocontroller, kann ich nur eine Nachricht senden. Wenn ich versuche, einen zweiten zu senden, wird der static int8_t CDC_Receive_FS (char* Buf, uint32_t *Len)Rückruf nicht aufgerufen, und auf dem PC hängt RealTerm. Mein Client-Programm hängt sich auch auf, wenn es das zweite Mal versucht, in den COM-Port zu schreiben.

Auf Microntroller-Seite habe ich meinen gesamten Code entfernt CDC_Receive_FS(), er kehrt derzeit nur zurück USBD_OK. In der Hauptfunktion gibt es nur einen HAL_Delay()periodisch aufgerufenen, ich habe versucht, dies auch zu entfernen, aber es hatte keine Wirkung.

Irgendwelche Ideen, was könnte das Problem sein?

Voller Empfangspuffer vielleicht irgendwo, Hardware- oder Software-Handshaking tritt ein?
Ich habe die Antwort gepostet, es muss ein Handshaking-Problem in der Software gegeben haben.

Antworten (1)

Ich habe die Antwort auf meine eigene Frage gefunden. Auf der folgenden Webseite finden Sie ein gut dokumentiertes Beispiel: http://visualgdb.com/tutorials/arm/stm32/usb/

Zuerst musste ich den generierten Code so vervollständigen, static int8_t CDC_Receive_FS (char* Buf, uint32_t *Len)wie er in der Quelle oben geschrieben ist.

Danach musste ich die int VCP_read(void *pBuffer, int size)Funktion erstellen und implementieren, wie sie in der oben genannten Quelle geschrieben steht.

Der springende Punkt war, dass ich die Funktion periodisch aufrufen musste int VCP_read(void *pBuffer, int size), um die empfangenen Daten aus dem Puffer auszulesen. Wenn ich diese Funktion nicht aufrufe, kann der PC beim nächsten Mal den COM-Port nicht schreiben.

Danke, dass du mich zur Antwort geführt hast. Für mich war der Schlüssel dazu das Hinzufügen eines Aufrufs zu 'USBD_CDC_ReceivePacket(&USBD_Device);' innerhalb des Empfangsrückrufs ... 'static int8_t CDC_Itf_Receive (uint8_t* Buf, uint32_t *Len)' Es scheint erforderlich zu sein, um dem Host-PC-Treiber mitzuteilen, dass wir das Paket in Ordnung erhalten haben.