Forum: PC-Programmierung USB Bulk Problem mit Paketen < 64Byte


von Tastkopf (Gast)


Lesenswert?

Hallo,

Ich hab mal wieder ein Problem mit meiner USB Übertragung. Ich hab schon 
einige Tests gemacht um das folgende Problem einzugrenzen.

Aufbau:
Eigenes USB Device, bestehend aus einem EFM32GG330F1024 mit integriertem 
Full-Speed USB Controller, verbunden mit einem Windows 7 PC.
Das Device besitzt einen IN- und einen Out-Endpoint, und die maximum 
data payload size ist 64Byte, ist auch so im Descriptor eingetragen.

Auf PC seite gibt es 2 Alternativen, eine Testsoftware basierend auf 
libusb-1.0

[c]
while (recLen < 65532)
    {
      try
      {
        if((len-recLen)%64!=0)
          templen = 
LibusbJava1.libusb_bulk_transfer(libusbDevice.getUsbHandle(), (byte) 
0x81, buffer, len-recLen+64-((len-recLen)%64), 0);
        else
          templen = 
LibusbJava1.libusb_bulk_transfer(libusbDevice.getUsbHandle(), (byte) 
0x81, buffer, len-recLen, 0);
        if(templen == -1)
          return templen;
        for(i = 0; i < templen && recLen < len; i++, recLen++)
        {
          b[recLen+off] = buffer[i];
        }
      }
      catch (LibusbError e)
      {
        throw new IOException(e);
      }
    }
[\c]

und einer Virtual COM Port implementierung unter C#.
Beiden lesen nur die daten dauerhaft aus und ermitteln die 
Geschwindigkeit.

auf dem Controller läuft in der Mainfunktion folgende Schleife:
[c]
for (;;)
  {
    USBD_Write(EP_DATA_IN, (void*) &test[0], 1024, NULL);
  }[\c]

So, nun zu meinem Problem, wenn ich auf dem controller 1024byte 
Pakete(Vielfaches von 64Byte) versende komm ich auf die maximal mögliche 
datenrate, wenn ich kein vielfaches von 64byte verwende liege ich WEIT 
darunter (30-50%). Gestestet mit verschiedenen Paketgrößen und sowohl 
mit libUSB als auch Virtual COM-Port.

laut USB-Spec 2.0: "The USB does not require that data payloads 
transmitted be exactly the maximum size; i.e., if a data payload is less 
than the maximum, it does not need to be padded to the maximum size."

und: "A bulk transfer is complete when the endpoint does one of the 
following:
• Has transferred exactly the amount of data expected
• Transfers a packet with a payload size less than wMaxPacketSize or 
transfers a zero-length packet"


sende ich auf dem controller 1024Byte pakete, liefert mit die libUSB 
Empfangsfunktion (auch wenn ich mehr als 1024 byte anfordere) 1024Byte 
zurück. Dies ist für alle Paketgrößen der Fall, egal ob Vielfache von 
64Byte oder nicht. So wie man dies erwarten würde. Allerdings ist über 
übertragung um 30-50% langsamer wenn die Paketgröße kein Vielfaches von 
64Byte ist.

HILFEEEE =/

Chris

von Jim M. (turboj)


Lesenswert?

> wenn ich kein vielfaches von 64byte verwende liege ich WEIT
> darunter (30-50%).

Dann gibt es ein "zu kurzes" Paket, was als "Ende des Transfers" 
angesehen wird. In diesem Falle scheint für den Rest des USB Frames 
(1ms) Ruhe zu sein, es werden erst im nächsten Frame neue Daten beim 
entsprechenden Endpoint angefragt.

Wenn man also kontinuierlich viel Daten übertragen möchte, dann muss man 
die 64 Byte auch voll ausnutzen.

Sendet man dagegen ein kurzes Paket oder ein Zero Packet (0 Byte Länge), 
wird ein "Ende" erkannt und die entsprechenden USB Funktionen kehren 
zurück - auch wenn eigentlich mehr Bytes nachgefragt wurden. Das braucht 
man wenn man z.B. für geringe Latenzen bei VCOM sorgen möchte oder die 
Größe vorher nicht bekannt ist.

von Tastkopf (Gast)


Lesenswert?

ok danke


Ich habe unabhängig vom oben genannten Problem, noch festgestellt das 
meine Full-Speed Verbindung an einem externen Hub deutlich schneller ist 
als direkt am PC (Hostcontroller-Hub).10-30% schneller und kommt fast an 
das theoretische Limit. Ich vermute mal das externe Hubs etwas anders 
arbeiten, wodurch geringere Latenzen bei Bestätigungen auftreten.
Falls jemand dazu bessere Erklärungen hat, welche einem helfen die 
Effekte besser zu verstehen, immer her damit =)

Grüße
Chris

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

oder am internen hängt noch das wlan oder das mauspad etc, was die 
datenrate drückt.
Bei meinem Laptop ist das deutlich je nach benutztem Steckplatz 
unterschiedlich.

von Christian R. (supachris)


Lesenswert?

Das mit dem Hub liegt am Transaction Translator im HUB. Der packt 
FullSpeed Pakete um in HighSpeed Microframes, da ist die Effizienz ein 
Stück höher. Wahrscheinlich hat der externe Hub mehrere solche 
Translatoren: http://en.wikipedia.org/wiki/USB_hub#Speed

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.