#include "threadbalance.h" #include #include ThreadBalance::ThreadBalance(QObject *parent) : QThread(parent) { //Répertorie toute les connexion et les port de l'ordinateur foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { //Ajoute le nom de l'objet courant (info) pour le rajouter dans la ComboBox portName = info.portName(); } firstTime = true; } void ThreadBalance::run() { serial= new QSerialPort(portName); //Paramètre de la liaison serial->setBaudRate(QSerialPort::Baud9600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); if((serial->open(QIODevice::ReadWrite))) { bool ret; ret = connect(serial,SIGNAL(readyRead()),this,SLOT(receptionData())); if(ret) { } else { //BUG } }//if (open) // Sinon (if open) else { }//else open } QString ThreadBalance::getFrame() { QByteArray buffer; QString frame; QByteArray in; bool quitter = false; int idx; frame.clear(); buffer.clear(); // Ignorer tous les caractères reçus avant l'appel de getFrame() this->serial->flush(); // Rafraichi l'affichage //QApplication::processEvents(); // Attendre la réception d'une trame entière while(!quitter) { // Attendre la réception de caractères pdt 5s max. if(this->serial->waitForReadyRead(100)) { // Lire les caractères reçus in = this->serial->readAll(); // Ajouter les caractères reçus au buffer buffer += in; // SI une trame entière a été reçue ALORS if((buffer.contains('\n')) && (buffer.length() >= 14)) { // Tronque la dernière occurence du buffer.truncate(buffer.lastIndexOf('\r')); // Récupérer uniquement la dernière trame reçue frame = buffer; idx = frame.lastIndexOf(QRegExp("[\r\n]")); if(idx != -1) { frame = frame.mid(idx+1); } quitter = true; } // FINSI } else { frame = "TimeOut"; this->serial->clearError(); buffer.clear(); quitter = true; } } return frame; } void ThreadBalance::receptionBeginPeser() { //QApplication::processEvents(); if(!firstTime) { connect(serial,SIGNAL(readyRead()),this,SLOT(receptionData())); } else { firstTime = false; } receptionData(); } void ThreadBalance::receptionData() { //QApplication::processEvents(); if(data.contains("0.00 Kg") || data == poidsPrevious) { data = getFrame(); } else if(data.lastIndexOf("Kg") == -1) { data = getFrame(); } else { disconnect(serial,SIGNAL(readyRead()),this,SLOT(receptionData())); poidsPrevious = data; Q_EMIT sigEnvoiePoids(data); } }