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.
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
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.
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.
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.
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.
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
>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.
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.
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.
Mit einer Latenz von einer Millisekunde wäre ich schon zufrieden. Der Rest wird dann eh gepuffert übertragen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.