wie funktioniert readyRead() Arbeit in der Qt?
Es ist meine erste Frage auf dieser website !
Ich habe einige Probleme beim Lesen von Daten von einem COM-port, sende ich eine vollständige Nachricht von einem anderen COM-port, und wenn ich es mit Qt, es ist immer schneiden Sie in mehrere Teil-messages.
void SerialPortReader::init()
{
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
void SerialPortReader::readData()
{
// m_serialPort->waitForReadyRead(200);
QByteArray byteArray = m_serialPort->readAll();
qDebug() << byteArray;
if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
&& byteArray.size() >= MIN_SIZE_DATA) {
decodeData(byteArray.constData());
} else {
qDebug() << "LIB SWCom : Unvalid trame !";
}
}
den Nachrichten gesendet werden, 25 oder 27 Bytes lang, wenn ich mit Putty oder Hyperterminal zu Lesen, ich habe keine Probleme.
Auch wenn ich mit 2 emulierten seriellen port COM zu kommunizieren, habe ich nicht dieses problem...
Es tritt nur bei Qt-lese-system UND mit 2 physikalischen COM-port...
Denke ich, dass ich nicht bekommen, wenn die readyRead signal genau...
Ich bin sehr verwirrt, vielen Dank im Voraus für Eure Hilfe !
Ja, es hat mir sehr geholfen, danke
InformationsquelleAutor palador | 2014-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Dokumentation ist eigentlich Recht deutlich:
Dies bedeutet, dass es ist nicht wirklich garantiert, wie viel Daten zum Lesen verfügbar sind, nur, dass einige verfügbar sein wird.
Wenn Sie möchten, Lesen mehr Daten als es kommt in einem gehen, Sie können entscheiden Sie sich für einen timeout-Wert und/oder readyRead. Es hängt davon ab, was Sie versuchen zu erreichen.
Sehen die command line async reader Beispiel, dass ich schrieb vor einer Weile für diesen Vorgang zu:
In diesem Fall die Befehlszeile reader Beispiel erhalten alle Daten, die übergeben wurde, auf einen Schlag, aber es garantiert nicht die Länge oder so.
Beachten Sie bitte auch, dass der sync-api, die hinter deinen Kommentaren nicht viel Sinn, zusammen mit dem async-API, die Sie zu Fragen. Ich beziehe mich auf
m_serialPort->waitForReadyRead(200);
hier.wie pro meine Antwort, können Sie timer verwenden. Mein Beispiel zeigt auch die Verwendung der timer.
bitte geben Sie ein feedback, wenn das Problem behoben ist.
Hallo, ich beantwortet
bitte reichen Sie keine Erklärungen, die als Antwort. Aktualisieren Sie einfach die Frage. Obwohl Sie sollte klar im Voraus.
InformationsquelleAutor lpapp
Den readyRead-signal emittiert, wenn es ausstehende Daten UND der vorherigen Ausführung readyRead beendet hat.
Dokumentation sagt:
Wenn dies dazu führen sollte, dass irgendwelche Probleme in deinem Fall könnte man mit einer while-Schleife, wo Sie überprüfen können bytesAvailable().
InformationsquelleAutor Robert
Verwenden Thread-Konzept , die Verwendung von threads Sie diese erreichen können... führen Sie Ihre portread in einem separaten thread, dann wird es funktioniert, andere weisen der Nachricht abgeschnitten werden.
andere Methode, die u verwenden können, Qprocess und öffnen Sie ein neues terminal mit QProcess und senden Sie die port-Nummer und verbindungen details, terminal und führen Sie es von Qt dann auch u kann das Archiv dies
ich meine, wir können therad und socket-Kommunikation hier anschauen dieser code
dies ist ein einfaches Beispiel für eine telnet-Verbindung, ebenso u kann angeben, welchen port Sie sich verbinden möchten und mit welcher ip -
check meine Antwort bearbeitet
InformationsquelleAutor Arunprasanth K V