Qtserialport: readall ne donne pas toutes les données et aucun nouveau signal de lecture de lecture

StackOverflow https://stackoverflow.com//questions/23014154

Question

Je lis dans un port série USB, mais parfois j'ai le problème, que les données sont "bloquées". Sur les messages reçus, j'envoie de nouveaux messages et j'attends de nouveau pour la réponse.

J'utilise Qt 5.2.1 sous Windows 7 avec Qtsérialport en mode Async. Après un certain temps, mon programme est coincé, car j'attends une réponse indéfiniment. (C'est une sorte de bug transitoire, mais cela se produit si vous attendez assez longtemps). Avec le débogueur, j'ai pu voir que je n'ai reçu que le fragment d'un message. Sur une enquête ultérieure, je peux voir que QSerialport a tout le message dans son "Readchunkbuffer".

Ceci est mon gestionnaire "Readyead":

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();
}
}

J'ai aussi essayé "alors que (port-> bytesAvailiable ()". Mais je ne vois qu'une partie du message dans msgbuffer, mais la totalité du tampon QSerialports. Je ne sais pas quand QSerialport émet le signal et quand il voit réellement le signal et quand il voit réellement le tout message.

Peut-être que c'est aussi un problème de tampon de pilote Windows? Ce qui me casse-t-on, c'est que si je tue ma candidature et que je tiens au putay et envoyez une nouvelle ligne, je reçois le reste du message. Notez que ce n'est probablement pas une question de mon "partenaire" de la communication série, BC. Cela fonctionne via Putty, etc. et je peux voir le msg dans "Readchunkbuffer".

Était-ce utile?

La solution 2

Il s'est avéré être un bogue dans le logiciel du périphérique intégré que le logiciel communique via un port série.: /

Autres conseils

Le problème peut être quelque part dans votre code.Parce que la Readyead () ne garantit pas que vous recevrez le message entier à la fois;Le message peut venir par des pièces sur les appels suivants Readyead ().

aussi je suis tendu par:

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

Pourquoi transformer de qbytearray en qstring, puis qstring à qbytearray deux fois?

Peut fournir une sortie de débogage de Qdebug () pour:

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

quand vous avez "coincé"?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top