USB CDC Bufferüberlauf erkennen

Gast #3057965
Lesenswert?

Hallo zusammen

Ich benutze ein PIC18F4550 und habe eine Routine geschrieben, wo er sich 
mittels USB als CDC Device anmeldet.

Wenn ich vom PC Daten zum PIC Senden möchte, funktioniert das ohne 
Probleme. Wenn ich jedoch Daten vom PIC zum PC sende (jeweils in 8 Byte 
Pakete) kommt zuerst lange nichts, und auf einmal erhalte ich alle 4096 
Bytes auf einmal.
Mit dem kann ich soweit noch gut leben, denn die 4096 Bytes setzen sich 
aus 512 * 8 Byte zusammen.

Leider frägt der PC nachdem er das ganze Paket erhalten hat den Endpunkt 
nicht mehr ab. Somit werden auch keine Daten mehr gesendet.

Kann mir jemand einen Tipp geben, wie ich den "Bufferüberlauf" 
frühzeitig erkennen kann, oder wie ich die Daten senden muss, damit ich 
kein Überlauf generiere.
Ich verwende als Treiber den CDC von Microchip

Herzlichen Dank für eure Antworten
#3057977
Lesenswert?

Falls Deine Datenblöcke exakt der Packetgröße der USB-Kommunikation 
entsprechen, mußt Du noch ein explizites leeres Paket hinterher senden, 
damit der USB-Stack weiss, dass dieser Datenblock komplett ist. Du 
kannst auch probeweise ein Byte weniger in die USB-Pakete reinstecken, 
dann sollten sie ebenfalls sofort in der Awendung ankommen.

Andere mögliche Ursache: Beim Bulk-Transfer wird der Endpunkt nicht 
abgefragt. Du mußt selber die Übertragung initiieren, z.B. indem Du mit 
jedem SOF Deinen Pufferfüllstand prüfst, und einen Bulk-IN-Transfer 
startest.
#3057984
Lesenswert?

Klingt, als würdest Du ein Vielfaches der 64 Byte Endpunktgröße 
versenden und dann das abschließende "Zero Packet" nicht hinterher 
schicken.

Eine CDC Übertragung wird für den PC beendet, wenn weniger als 64 Byte 
im USB Bulk Paket übertragen werden. Wenn also das letzte Paket nun 
genau 64 Byte groß war, muss man ein "Zero Packet" - mit null Byte Länge 
- hinterher senden.

Edit: Mist, zu langsam.
Gast #3059084
Lesenswert?

Hallo

Herzlichen Dank für Ihre Antowrten.
Ich habe eure Ideen mal ausprobiert, jedoch mache ich wahrschienlich 
noch etwas falsch.

Wenn ich ein Byte weniger sende, zeigt mir die Anwendung den Empfang 
korret an. Dasselbe passiert auch, wenn ich ein "Zero Packet" sende.
Das Problem ist nun, dass nach dem Empfang der Host keine weiteren 
Pakete mehr empfängt/abfrägt.

Muss ich noch irgendwo ein Flag löschen?

Gruss

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren