Forum: PC-Programmierung Serielle Schnittstelle, Arduino 2560, Latenz


von Patrick S. (patrick_s81)


Lesenswert?

Hallo,

ich habe ein Problem mit der Latenz der Seriellen Schnittstelle. Ich 
kommuniziere mit einem C++ Programm und dem Arduino 2560 über 
USB(COM-Port). Die Baudrate liegt bei 1 MBaud und funktioniert auch 
reibungslos. Problematisch dabei ist, dass ich häufig nur sehr kleine 
Datenpakete übertrage(<5 Byte). Wenn ich jetzt zwei Datenpakete 
nacheinander(ohne Puffer) verschicke, liegt die Latenz zwischen zwei 
Datenpaketen bei 6-8 Millisekunden. Testweise habe ich die Daten über 
ein richtiges USB-Interface verschickt und hier erreiche ich 
Latenzzeiten von 1 Millisekunde.

Gibt es eine Möglichkeit die Latenzzeit zu verkürzen?

Welche Latenz würde man mit PCI oder PCI-Express erreichen?

Danke im voraus.

von bluppdidupp (Gast)


Lesenswert?

1ms Latenz ist bei Full-Speed USB schon sehr gut, mit Highspeed-USB oder 
PCI-Express dürfte auch weniger möglich sein - Allerdings wird 
vermutlich der jeweilige Treiber und das Betriebssystem da trotzdem 
einen Strich durch die Rechnung machen.

Wenn für die Kommunikation zwischen PC und µC niedrige Latenzen benötigt 
werden liegt da meiner Meinung nach schon ein Fehler im Konzept vor - 
Zumindest sofern da nicht ein Echtzeitbetriebssystem drauf läuft ;D

von Patrick S. (patrick_s81)


Lesenswert?

Der Plan ist es später die Kommunikation in den ATmega zu verschieben. 
Aber 1 ms Latenz hätte ich schon bei der seriellen Kommunikation 
erwartet.

von Kaj (Gast)


Lesenswert?

Patrick S. schrieb:
> Aber 1 ms Latenz hätte ich schon bei der seriellen Kommunikation
> erwartet.
Die Kommunikation ist nicht das Problem. Da gibts noch andere Sachen die 
Probleme machen wie: Betriebssystem, usb-stack, treiber, usw.

Patrick S. schrieb:
> Problematisch dabei ist, dass ich häufig nur sehr kleine
> Datenpakete übertrage(<5 Byte)
Wie du selber sagst: Das ist ein Problem. Also: ändere das!
Langsamer Senden, oder größere Pakete.
Alternativ: Hartes Echtzeit Betriebssystem und ggf. den Scheduler 
anpassen!

Die Frage ist doch viel mehr: Wenn (offenbar) der groß Teil deiner Daten 
eh kleine häppchen sind, wozu brauchst du dann die 1Mbit? Das sind 
immerhin 125.000 Byte/s.

Patrick S. schrieb:
> Wenn ich jetzt zwei Datenpakete
> nacheinander(ohne Puffer) verschicke, liegt die Latenz zwischen zwei
> Datenpaketen bei 6-8 Millisekunden. Testweise habe ich die Daten über
> ein richtiges USB-Interface verschickt und hier erreiche ich
> Latenzzeiten von 1 Millisekunde.
Keine Ahnung was du da machst, aber wenn der zeitliche Abstand 
zwischen 2 Paketen kleiner 1ms sein sollen, dann reichen 9600Baud!
9600Baud / 8 = 1200 Byte/s
1000ms / 1200Byte = 833µs

Sprich: Bei 9600Baud kommt ca. alle 834 Mikrosekunden ein Paket an. Was 
dann noch so passiert (usb-stack, Treiber, usw.) das ist ne andere 
Sache.
Wenns n bisschen flotter sein soll, nimsmte halt 19,2k, das erfüllt 
deiner Anforderung von 1ms mehr als genug und macht auch weniger 
Probleme, als dein 1Mbit.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kaj schrieb:
> 9600Baud / 8 = 1200 Byte/s

Die Rechnung stimmt nicht, Du unterschlägst (mindestens) Start- und 
Stopbits. Damit sind 9600 Baud nur 960 Byte/sec.

von Patrick S. (patrick_s81)


Lesenswert?

Das System der vom Atmega angesteuert wird, arbeitet mit einer Latenz 
von ca. 5 Mikrosekunden zwischen zwei Datenpaketen. Der Atmega arbeitet 
nur als Umsetzer von USB auf einen parallelen Bus. Und es müssen häufig 
beliebige Register ausgelesen werden. Früher wurde das System mit Dos 
angesprochen.

von Kaj (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Die Rechnung stimmt nicht, Du unterschlägst (mindestens) Start- und
> Stopbits. Damit sind 9600 Baud nur 960 Byte/sec.

1 zu 0 fuer den Moderator :D
Danke fuer den Hinweis, hab ich tatsaechlich vergessen. aber selbst 
damit liegt man immer noch bei ~1ms (1,04166...ms).

Gruesse

von Uwe (Gast)


Lesenswert?

>ich habe ein Problem mit der Latenz der Seriellen Schnittstelle.
Das Problem ist nicht die serielle Schnittstelle sondern USB.
> USB(COM-Port)
Du könntest versuchen im Gerätemanager die Puffergröße kleiner 
einzustellen und den Timeout herabzusetzen. Wenn du aber kein 
Echtzeitbetriebsystem hast kann sich das OS auch mal nen paar Sekunden 
Latenz genemigen wenn ihm danach ist.

von Patrick S. (patrick_s81)


Lesenswert?

Den Datenpuffer zu ändern hat leider nichts gebracht. Kann man auf dem 
Arduino Board eigentlich einen richtigen USB-Treiber verwenden? Der 
sollte doch schneller sein, als der Com-Port Treiber.

von bluppdidupp (Gast)


Lesenswert?

Mit USB-Fullspeed wird man nicht unter 1ms kommen:
http://en.wikipedia.org/wiki/USB#Latency
http://doc.utwente.nl/56344/1/Korver03adequacy.pdf (3.4)
...der Arduino kann aber nur Full-Speed.

von Patrick S. (patrick_s81)


Lesenswert?

Mit einer Latenz von einer Millisekunde wäre ich schon zufrieden. Der 
Rest wird dann eh gepuffert übertragen.

von Patrick S. (patrick_s81)


Lesenswert?

Hab das Problem mit einem ftdi-Kabel umgangen. Im Gerätemanager kann man 
die Latenz/Wartezeit nämlich einstellen.

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.