Schnelle serielle (RS-232) Kommunikation unter Windows (XP, 7, C++, Qt)?

Gast #3032271
Lesenswert?

Bei meiner seriellen Übertragung ist die Portzugriffgeschwindigkeit 
entscheidend für die Gesamtdauer, und die gilt es zu minimieren. 
Momentan nutze ich eine an Qt angepasste Bibliothek, die aber offenbar 
nicht vollständig implementiert ist, d.h. ich muss teilweise pollen und 
warten.
Eine ältere Implementierung mit ReadFile() und SetCommTimeouts() ist 
etwas schneller, aber immer noch nicht so schnell wie die Übertragung 
von einem Mikrocontroller aus (ist ja klar, der schickt nach wenigen µs 
eine Antwort und muss nicht auf BS und USB warten).

Die Frage ist also: kann man das irgendwie beschleunigen?
Gast #3032289
Lesenswert?

uffa schrieb:
> Eine ältere Implementierung mit ReadFile() und SetCommTimeouts() ist
> etwas schneller, aber immer noch nicht so schnell wie die Übertragung
> von einem Mikrocontroller aus (ist ja klar, der schickt nach wenigen µs
> eine Antwort und muss nicht auf BS und USB warten).
>
> Die Frage ist also: kann man das irgendwie beschleunigen?

das kann ich nicht galauben. Liest du jedes Byte einzeln mit Readbyte 
oder mehre?

Ein PC schafft es bequem 1Mbaud zu lesen, das muss man schon sehr viel 
falsch machen damit es langsamer wird.
Gast #3032347
Lesenswert?

Genau "Peter II", das Problem ist, dass ständig Bytes einzeln 
gelesen/geschrieben werden. Es wäre besser, die Daten zusammen per USB 
zu übertragen und die RS-232 Verbindung dann per Mikrocontroller zu 
erledigen.

Es werden u.A. Wandler von FTDI und Prolific genutzt, auf den 
Schnittstellentyp habe ich keinen Einfluss.

Danke "xxx" für den Tipp mit dem Puffer, ich werde mal versuchen, an den 
Einstellungen drehen
#3032348
Lesenswert?

Hi,

man muss vor allem bei USB-seriell-Wandlern zwischen Durchsatz und 
Latenz unterscheiden. Den Durchsatz mag man mit entsprechenden 
Protokollen noch ganz gut hin bekommen, bei der Latenz sind USB-Lösungen 
aber echten PCI-E-Seriell-Karten haushoch unterlegen.
Das Problem bei USB ist, dass es keine Hardware-Interrupts gibt und der 
Host (PC) auch s.g. "interrupt transfers" immer selbst initiieren muss 
(polling). Dadurch ergibt sich auf der einen Seite (je nach Treiber und 
USB-Modus) eine vergleichsweise sehr hohe Round Trip Time von 
Datenpaketen und auf der anderen Seite eine hohe Empfindlichkeit für 
FIFO-Überläufe bei hohen Datenraten ohne Flusskontrolle.
PCI/PCI-E-Karten können dagegen Hardware-Interrupts auf der CPU beim 
Empfang der Daten auslösen und stellen somit die empfangenen Daten der 
Anwendung viel schneller zur Verfügung.
Irgendwie habe ich diesbezüglich Verbesserungen bei USB3 im Kopf, kann 
mich aber gerade nicht genau entsinnen.
Was ich eigentlich damit sagen möchte: Es liegt nicht am Betriebssystem, 
dass Deine Daten zu langsam ankommen, sondern viel eher an der 
Implementierung und an der verwendeten Hardware. Ich habe hier mit 
speziellen PCI-RS485/422-Karten problemlos ~10 MBit/s bei sehr geringen 
Latenzen übertragen.

Gruß,
Oliver
Persönliche Seite #3032410
Lesenswert?

Protokolle für die serielle Schnittstelle sollte man so aufbauen, daß 
nicht einzelne Bytes im "ping-pong"-Verfahren übertragen werden, sondern 
immer größere Datenblöcke gesendet bzw. empfangen werden. Dafür sind die 
seriellen Schnittstellen üblicher PCs optimiert, das hat mit den Sende- 
und EmpfangsFIFOs in der Standard-PC-UART 16550 angefangen, und ist bei 
USB-Seriell-Adaptern noch ausgeprägter.

Idealerweise sollten Antworten asynchron ausgewertet werden, d.h. bei 
einer blockorientierten Übertragung sollte nicht nach jedem Block auf 
eine Quittung gewartet werden. Ein Beispiel dafür ist das 
ZModem-Protokoll.

Natürlich ist diese letzte Eigenschaft nicht überall sinnvoll abbildbar, 
aber man sollte so etwas bei der Gestaltung eines Protokolles im 
Hinterkopf behalten.
Gast #3032472
Lesenswert?

Ich hab mal eine Simulation geschrieben, in der Datenrate und Delays 
gegeneinander abgewogen werden, und dann wurde klar dass der dDelay 
schnell mal dominiert. Das bedeutet man sollte das Protokoll auf grosse 
Bloecke optimieren.
Lass mal hoeren weshalb du einzelne Bytes uebertragen moechtest. Und wir 
erzaehlen dann wie man das mit grossen Bloecken besser macht.
Gast #3045145
Lesenswert?

Sry aber ich hab mir das jetzt mal durchgelesen und irgendwie kapier ich 
nicht um was es eigentlich geht.

>Eine ältere Implementierung mit ReadFile() und SetCommTimeouts() ist
>etwas schneller, aber immer noch nicht so schnell wie die Übertragung
>von einem Mikrocontroller aus
Ist da nicht immer ein uC im Spiel, oder überträgst Du von PC nach PC?

>von einem Mikrocontroller aus (ist ja klar, der schickt nach wenigen µs
>eine Antwort und muss nicht auf BS und USB warten).
Und was meinst Du hiermit? Was bedeutet BS? Wer wartet hier auf USB? Der 
PC mit Sicherheit nicht. Das erledigt der USB-Host.

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