Forum: Mikrocontroller und Digitale Elektronik USB CDC Bufferüberlauf erkennen


von SPI (Gast)


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

von Eddy C. (chrisi)


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.

von Jim M. (turboj)


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.

von SPI (Gast)


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

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.