Serielle Schnittstelle, Arduino 2560, Latenz

OP #3597895
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.
Gast #3598061
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
Gast #3598304
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.
OP #3598523
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.
Gast #3599141
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.

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