Domanda

Sto leggendo da una porta seriale USB, ma a volte ho il problema, che i dati vengono "bloccati". Nei messaggi ricevuti, invio nuovi messaggi e attendo nuovamente la risposta.

Sto usando QT 5.2.1 su Windows 7 con Qtserialport in modalità Async. Dopo un po ', il mio programma rimane bloccato, perché sto aspettando una risposta indefinitamente. (È un tipo di bug transitorio, ma succede se aspetti abbastanza a lungo). Con il debugger, sono stato in grado di vedere che ho ricevuto solo il frammento di un messaggio. Su ulteriori indagini, posso vedere che QSerialport ha l'intero messaggio nel suo "LetturaChunkbuffer".

Questo è il mio gestore "Readyread":

void ModuleCommunicator::onReadyRead()
{
if (port->bytesAvailable() > 0) {
    QString msg = QString(port->readAll());
    msgBuffer->append(msg);
    //qDebug() << "onReadyRead: msg: " << msg;

    if (msg.endsWith("\n")) {
        msg = msgBuffer->join("").trimmed();
        msgBuffer->clear();
        msgBuffer->append(msg.split("\r\n"));
    } else {
        return;
    }

    for (int i = 0; i < msgBuffer->size(); i++) {
        msg = msgBuffer->at(i);

        qDebug() << "MSG: " << msg << endl;

        if (isResponse(msg)) {
            handleMsg(msg);
        }
    }

    msgBuffer->clear();
}
}
.

Ho anche provato "while (port-> bytesAvailable () ()". Ma vedo solo parte del messaggio in msgbuffer, ma tutto il tampone QSerialports. Non sono sicuro quando QSerialport emette il segnale e quando vede il tutto messaggio.

Forse questo è anche un problema del buffer del driver di Windows? Ciò che mi perfonde è che se uccido la mia applicazione e tira il fuoco e invia una nuova linea, ottengo il resto del messaggio. Si noti che questo probabilmente non è un problema del mio "partner" di comunicazione seriale, aC. Funziona tramite Putty, ecc. E posso vedere il messaggio in "LetturaChunkbuffer".

È stato utile?

Soluzione 2

Si è rivelato un bug nel software del dispositivo incorporato che il software comunica tramite la porta seriale.: /

Altri suggerimenti

Il problema può essere da qualche parte nel tuo codice.Perché il readyread () non garantisce che riceverai l'intero messaggio contemporaneamente;Il messaggio può arrivare in parti per le seguenti chiamate Readyread ().

Anche io sono teso da:

QString msg = QString(port->readAll());
msgBuffer->append(msg);
.

Perché trasformare da qbytearray a QString, quindi QString a QbyTearray due volte?

Può fornire un output di debug da QDEBUG () per:

void ModuleCommunicator::onReadyRead()
{
    ...
    QByteArray ba = port.readAll();
    qDebug() << ba;
    ...
}
.

Quando "bloccato"?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top