Kontinuierliche Datenrate Mikrokontroller -> PC über USB

Gast #4110866
Lesenswert?

Welche kontinuierliche Datenrate (soll ein Datenlogger werden) ist mit 
einem aktuellen PC mit Windows und einem STM32 möglich?
Welche USB Device Class wäre empfehlenswert (=zuverlässige 
Datenübertragung in der richtigen Reihenfolge und kontrollierter Latenz) 
und wie würdet ihr das Programm auf dem PC schreiben? .Net (C#) ok?
Ziel ist es, problemlos auch mehrere Datenlogger über einen USB Hub 
anzuschließen.
#4110971
Lesenswert?

Hallo,
> Daniel Hofer schrieb:
> Welche kontinuierliche Datenrate (soll ein Datenlogger werden)
Was soll er denn loggen, mit welchen Parametern?

>ist mit
> einem aktuellen PC mit Windows und einem STM32 möglich?
Mit Windows auf einem PC wäre mit USB2.0 eine Brutto-Datenrate von 
480MBit möglich. Praktisch einiges weniger.
Das wird dein uC aber womöglich gar nicht schaffen.

> Welche USB Device Class wäre empfehlenswert (=zuverlässige
> Datenübertragung in der richtigen Reihenfolge und kontrollierter Latenz)
Da Windows kein Echtzeit-OS ist, kannst du das mit der Latenz vergessen.
Da muß der uC selbst schon mal Zwischenspeichern.
Mit dem PC kannst du dann diese Datenpakete abholen.

> und wie würdet ihr das Programm auf dem PC schreiben? .Net (C#) ok?
> Ziel ist es, problemlos auch mehrere Datenlogger über einen USB Hub
> anzuschließen.
Dann teilen sich die Logger schon mal die Datenrate.
Aber im ungünstigen Fall hängen am gleichen USB-Host auch noch andere 
USB-Devices und nehmen Ressourcen weg.
#4111112
Lesenswert?

Was willst du denn genau wissen? Das ganze Setup zu beschreiben würde 
etliche Seiten füllen ;)
Der Controller, den ich verwende, ist ein LPC4333. Der Endpoint ist 
Bulk, einfach weil mir Isochronous zu kompliziert war. Ich nehme auf dem 
uC kontinuierlich 11 MB/s Daten auf, die in eine Art Ring-Puffer 
geschrieben werden, der aus 5 Blöcken mit je 16kB Größe besteht. Ist 
einer dieser Blöcke voll, wird ein Flag gesetzt und der Inhalt des 
Blocks über USB übertragen (man schreibt in so einen Write-Buffer und 
der eigentliche Transfer passiert dann asynchron im Hintergrund). Sobald 
die Übertragung beendet ist, wird das Flag wieder gelöscht und der Block 
kann von neuem beschrieben werden. Das funktioniert gut, solange der 
Computer ansonsten nur mäßig viel zu tun hat. Wenn der Computer 
ansonsten gerade viel zu tun hat, kann es vorkommen, dass er keine Daten 
abholt bevor alle 5 Blöcke voll sind, und dann gehen eben tatsächlich 
welche verloren. Ich vermute, das könnte man recht gut verhindern, indem 
man die Daten in einem Kernel-Modul in einen Buffer schreibt statt im 
Userspace; für meine Anwendung ist das aber egal, wenn da hin und wieder 
mal ein Paket fehlt. Fünfmal so viel SRAM zum Beschreiben würde aber 
sicherlich auch viel helfen.
#4111253
Lesenswert?

Ein Virtual Com Port ist auch nur ein Bulk-Transfer

Für Bulktransfers stehen laut USB-Spezifikation maximal 80% der Bus-Zeit 
zur Verfügung, die sich alle Bulk-Endpoints teilen müssen.

kurzes kopfrechnen...

theoretisches netto, versteht sich
Gast #4111917
Lesenswert?

Daniel Hofer schrieb:

> Welche kontinuierliche Datenrate (soll ein Datenlogger werden) ist mit
> einem aktuellen PC mit Windows und einem STM32 möglich?
> Welche USB Device Class wäre empfehlenswert (=zuverlässige
> Datenübertragung in der richtigen Reihenfolge und kontrollierter Latenz)

Du mußt dich schon entscheiden: Latenz kontrollieren (isochroner 
Transfer) oder Daten sicher übertragen (bulk Transfer). Beides 
gleichzeitig geht nicht. Nicht bei USB, nicht bei Windows und auch bei 
keinem anderen OS oder Bussystem.

GRUNDLAGENKENNTNISSE
Gast #4112266
Lesenswert?

Daniel Hofer schrieb:
> Mir ist schon klar das zwischengepuffert werden muss.

Aber auch nur dann, wenn Dein Controller nicht schnell genug ist, um 
neue Daten zu liefern.

Es wäre mal Interessant zu wissen, was Du überhaupt vor hast. Es ist 
nämlich durchaus ein Unterschied, ob Du die Daten kontinuierlich senden 
willst (ich nenns mal 'in Echtzeit'), oder ob da auch mal Pausen 
dazwischen sind.

Ich hatte mal eine Anwendung erstellt, die 24 MBytes/s an den PC sendet. 
Der Controller (FX2) hat da aber nichts anderes gemacht, als die Daten 
am Parallelport direkt in die USB Puffer zu schieben. Da ist dann keine 
Zeit mehr zu überlegen, ob die Daten auch sinnvoll sind. Das Auswerten 
muss dann am PC erfolgen. Und genau das ist auch die größere 
Herausvorderung.

Abgesehen davon verabschiedet sich Dein Hub, sobald Du mehrer Geräte von 
diesem Typ dranhängst, weil der ja meist auch nur High-Speed kann - und 
zwar genau ein Mal.
#4112274
Lesenswert?

Potter schrieb:
> Abgesehen davon verabschiedet sich Dein Hub, sobald Du mehrer Geräte von
> diesem Typ dranhängst, weil der ja meist auch nur High-Speed kann - und
> zwar genau ein Mal.

Nee, die teilen sich dann die Bandbreite. Da verabschiedet sich nix.

Potter schrieb:
> Ich hatte mal eine Anwendung erstellt, die 24 MBytes/s an den PC sendet.
> Der Controller (FX2) hat da aber nichts anderes gemacht, als die Daten
> am Parallelport direkt in die USB Puffer zu schieben. Da ist dann keine
> Zeit mehr zu überlegen, ob die Daten auch sinnvoll sind. Das Auswerten
> muss dann am PC erfolgen. Und genau das ist auch die größere
> Herausvorderung.

Da braucht man halt schnelle Rechner. Wir haben hier Geräte entwickelt 
mit dem FX2 und dem FX3, da kommen auch 40MB/s bzw. 320MB/s in den PC 
und müssen verarbeitet werden. Alles machbar.
Gast #4112281
Lesenswert?

Christian R. schrieb:
> Nee, die teilen sich dann die Bandbreite. Da verabschiedet sich nix.

Theoretisch schon.

Christian R. schrieb:
> Da braucht man halt schnelle Rechner. Wir haben hier Geräte entwickelt
> mit dem FX2 und dem FX3, da kommen auch 40MB/s bzw. 320MB/s in den PC
> und müssen verarbeitet werden. Alles machbar.

Sagt auch keiner, dass es nicht machbar ist. Aber die Daten an den PC zu 
schaufeln ist alle Mal einfacher, als sie dann in der genannten Menge am 
PC auszuwerten.
Persönliche Seite #4112348
Lesenswert?

Daniel Hofer schrieb:
> Was ist das Maximum, das man mit einem Virtual Com Port erreichen kann?

Die Suche nach "ftdi maximum baud rate" ergibt "The maximum Baud rate 
achieveable with FTDI's current devices is 3M Baud."

Die Datenrate vom STM32 muss am USART dann auch genau 3M Baud sein.

Dafür kannst Du dann auch einen STM32 ohne USB-Controller nehmen, weil 
Du ja den USART nutzt.

Die Frage war aber ursprünglich
> Welche … Datenrate … ist mit einem … PC … und einem STM32 möglich?

Also mit oder ohne FTDI bzw. externen USB High Speed Phy?!

Little Basdart schrieb:
> der STM kann von haus aus nur USB full speed (12Mbit/s)

Also bei "80% Bus-Zeit"^^ 9.5M Baud Bulk-Transfer. Richtig?

> Damit dürfte die PC Software deutlich einfacher werden...

Einfach, falls Du z.B. einen FTDI-Treiber nimmst. Falls Du den Virtual 
Com Port über STM32-Firmware umsetzt, kannst Du auch gleich ein 
HID-Device nach Deinen Erfordernissen programmieren.

Daniel Hofer schrieb:
> Welche USB Device Class wäre empfehlenswert (=zuverlässige
> Datenübertragung in der richtigen Reihenfolge und kontrollierter Latenz)

Mit vertretbarem Aufwand: HID, sonst musst Du noch Windows-Treiber 
programmieren.
  PS: HID geht auch mit 480Mbit/s.

> und wie würdet ihr das Programm auf dem PC schreiben? .Net (C#) ok?

Diese Frage löst regelmäßig Glaubenskriege im Forum aus. C#.Net ist ok. 
Ich persönlich hätte die gleiche Entscheidung getroffen, aber das beste 
Tool ist oft das, was man am besten kennt.

Falls Du doch was mit externen USB-Phy und High Speed (480Mbit/s) 
machst, kann es erforderlich sein, einige Auswertungen mit "unmanaged 
code" zu programmieren.
#4112600
Lesenswert?

Also wir benutzen Bulk und ohne Geräte Klasse. Quf PC Seite kommt der 
WinUsb Treiber zum Einsatz, Libusb wäre genauso einfach und ebenfalls 
fertig und signiert. Also nix selber Treiber programmieren und auch kein 
Stress mit x64. Auch wir nutzen C#, nur die unterste Ansteuerung der 
Winusb ist natürlich unmanaged. Das geht ganz gut, man muss halt bissl 
Nachdenken, dass man nicht immer alles Arrays dynamisch machtr und 
umkopiert.

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