Je travaille avec un périphérique série. QSerialPort se trouve dans un thread distinct. thread est créé de cette façon:QSerialPort - Wating pour l'ensemble des données de l'expéditeur
QThread* serialthread = new QThread;
Serial* serial = new Serial();
serial->moveToThread(serialthread);
Lorsque les données sont disponibles ce signal dans mon travailleur de fil est emited:
void Serial::process()
{
serialport = new QSerialPort();
connect(this->serialport,SIGNAL(readyRead()),this,SLOT(readyToRead()));
}
void Serial::readyToRead()
{
emit SIG_dataAvailable(this->read());
}
Ceci est la fonction qui lit les données et vérifie si les données sont correctes - le second octet sur mon appareil de série indique depuis combien de temps le reste du paquet est ...
QByteArray Serial::read() const
{
QByteArray receivedData;
int length;
receivedData = serialport->readAll();
length = receivedData[1];
if(length != receivedData.length() - 1)
{
qDebug() << "protocol error.";
return NULL;
}
return receivedData;
}
mon problème est que le signal QSerialPort :: readyRead est emited avant la da ta à partir du périphérique série est terminée dans le tampon. Une idée de comment résoudre ce problème?
i mettre m Qserial dans un fil differnt parce que je vouloir surveiller un ECU de voiture en temps réel. Je l'ai essayé dans le processus mainwindow et le GUI était très laggy –
Je pense, il gèle parce que vous utilisez QSerialPort dans un "blocage" (non asynchrone). C'est pourquoi il gèle http://code.qt.io/cgit/qt/qtserialport.git/tree/src/serialport/qserialport.cpp#n201 – YouDoItWrong