Tja, das ist eben immer das Problem mit den tollen Universal-Quellen,
die von den Herstellern gelegentlich angeboten werden: Sie lösen nicht
die Probleme, sondern verlagern sie bloß.
Die Funktionen in usbd_usr.c sind eigentlich nur Platzhalter, damit beim
Compilieren alles durchläuft. Natürlich könnte man sowas anders
organisieren und z.B. nur eine Funktion "start()" vorsehen, die beim
Öffnen einer seriellen Schnittstelle im PC aufgerufen wird und die dann
die Puffer für den Transfer initialisiert und ggf. ne Startmeldung in
den Ausgangspuffer setzt usw. - aber sowas wäre den Programmierern bei
ST, NXP und Konsorten ja zu einfach.
Die Funktionen in usbd_cdc_vcp.c hingegen sollten eigentlich richtig
ausgefüllt sein. Klar, sie sind auch nur Platzhalter, aber solche, die
auf USB-Botschaften reagieren sollen. Dazu zählt das Empfangen und
Senden der Schnittstellen-Einrichtung (Baudrate, Bitanzahl, Stoppbits,
Parität..) und das Empfangen von rts/cts usw. Bei einer internen
Verwendung der Datenströme ist das zwar egal, aber so einfach schnöd
garnix tun ist auch nicht richtig.
Tja, und die Handhabung der eigentlichen Datenströme ist zumeist auch
lausig. Wenn man nen virtuellen COM Port benutzen will, dann will man
dort auch asynchron und byteweise damit verkehren und nicht blockweise.
Ich hab das (allerdings bei nem Nuvoton NUC120) etwa so gemacht:
Für IN und OUT gibt es jeweils treiberinterne Ringpuffer. Der für IN
(also vom Device zum Host) braucht nur so groß zu sein wie die
zugehörige Endpoint-Puffergröße. Abgefragt wird er über den 1 ms
USB-Tick. Der Puffer für OUT hingegen sollte mindestens größer als die
doppelte Endpoint-Puffergröße sein. Kommt ein Paket an, dann wird es
erstmal angenommen und in den Puffer gepackt. Ist danach noch genug
leerer Platz im Puffer für eine nächstes Paket, dann wird der Endpoint
wieder empfangsbereit geschaltet. Ist hingegen nicht mehr genug Platz im
Puffer, dann wird der Endpoint auf Länge 0 gesetzt, d.h. er sagt dem
Host, daß er nur noch Blöcke mit 0 Byte Länge annehmen wird, quasi NAK.
Das geht dann so lange, bis (asynchron geleert) wieder genug platz im
Ringpuffer ist.
W.S.