Seite 1 von 1

Qextserialport langsam bei read

Verfasst: 22. Januar 2010 09:01
von Ozzy
Moin,

ich spiele gerade etwas mit der qextserialport library rum. Was mich aber wundert ist, dass das Lesen extrem lange dauert. Der read-Methode können ja die Anzahl der zu lesenden Bytes mitgegeben werden. Dann müsste er doch eigentlich aufhören, wenn die Bytes voll sind. Trotzdem ist die Dauer des Lesens vom eingestellten Timeout abhängig.
Ich habe jetzt einmal probiert, 2 Bytes zu lesen:

Code: Alles auswählen

    QTime *time = new QTime();
    time->start();
    if ( !(SendCommand(sequence, sizeof(sequence), 0)) ) return false;
    std::cerr << "SendCommand: " << time->elapsed() << std::endl;
    time->restart();
    qint64 res = port->read((char*)result,sizeof(values));
    std::cerr << "Read: " << time->elapsed() << std::endl;
    std::cerr << "res: " << res << std::endl;
Für das Schreiben benötigt er 0ms, was sehr gut ist. Für das Lesen jedoch 15ms bei einem Timeout von 10ms. Stelle ich den Timeout auf 100ms, dann sind es 109ms.
Das gleiche Gerät mit der gleichen Anfrage nur in C# programmiert braucht für das Lesen nur 2ms...

Wisst Ihr eine Möglichkeit, wie man das irgendwie beschleunigen kann???

MfG, und vielen Dank, Ozzy

Verfasst: 22. Januar 2010 09:14
von Ozzy
Moin,

ich habe gerade herausgefunden, dass

Code: Alles auswählen

qint64 res = port->readLine((char*)values,3);
DEUTLICH schneller ist, als Read. Dann komme ich auch sogar noch unter die 2ms vom C# Programm. Allerdings ist das ganz schön hässlich, da ich ja so ein Zeichen zu viel lese, und wieder Speicher kopieren muss...
Aber versteht das jemand???

MfG, Ozzy

Verfasst: 22. Januar 2010 20:05
von FaS
Ich verwende auch read(), bei mir liegt die Zeit unter dem Timeout. Ich lese in 1024er-Blöcken, vielleicht darf der Wert nicht zu groß sein. Hmm aber du gibst ja res aus, ich nehme an das wird schon mit sizeof(values) übereinstimmen?
In deim letzten Post steht (char*)values - was ist denn sizeof(values), nicht 2 oder? Hast gesagt du ließt 1 Zeichen zu viel. Laut Doku kannst du auch einfach statt 3 wieder 2 schreiben, er ließt bis newline ODER maxSize.
Beim Öffnen habe ich QIODevice::Unbuffered mitübergeben. Ansonsten gibts da ja nicht viel zu beachten..

Verfasst: 25. Januar 2010 09:20
von Ozzy
Moin,

danke für Deine Antwort. Also bei mir gibt es auch keinen Timeout; trotzdem ist die Zeit, die er benötigt, irgendwie vom Timeout abhängig. Habe übrigens gemerkt, dass es mit dem ReadLine doch nicht schneller geht...
Alles sehr merkwürdig...
Was bedeutet eigentlich das unbuffered? Konnte dazu nichts finden. Normalerweise wird doch immer gebuffert (also von der Hardware), oder nicht?

Verfasst: 25. Januar 2010 11:14
von FaS
Sorry kann ich nicht beantworten, so funzt es einfach nur.. d.h. mein Timeout steht auf 1sek oder so und die Lesezeit liegt darunter, auch nicht sonderlich schnell aber könnte an der Hardware liegen, hab ich noch nicht gemessen.