Partage
  • Partager sur Facebook
  • Partager sur Twitter

Qt5 LCDNumber->display() fait crasher l'app

Sujet résolu
    12 octobre 2020 à 12:22:06

    Bonjour,

    Je code sur Mac OS Catalina dans Qt Creator pour créer une IHM devant afficher des données reçues via la liaison série. La partie réception de données fonctionne bien, mais impossible de les afficher avec des LDCNumber, le seul code d'erreur que j'ai étant :

    "12:08:26: Le programme s'est terminé subitement."

    Quand j'essaye d'utiliser le débugger (mais je ne sais quasi pas m'en servir) il m'affiche le fichier source dans lequel sont définies les fonction de LCDNumber...

    J'ai essayé de redémarrer Qt Creator et mon ordi plusieurs fois (au cas où) mais rien n'y fait.

    Si dessous mon code avec indiquée la ligne à partir de laquelle l'app crash (repérée avec qDebug).

    main.cpp

    #include "mainwindow.h"
    
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
        return a.exec();
    }
    

    mainwindow.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    
    #include <QSerialPort>
    #include <QTimer>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class MainWindow; }
    QT_END_NAMESPACE
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        QSerialPort *m_port = nullptr;
        QTimer *timer = nullptr;
    
        void closePort();
        void sendData(const QString &trame);
        void decryptTrame();
        void warningRot();
        void warningTemp();
        void listenData();
    
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
    
    public slots :
        void changeRotation();
        void handleReadyRead();
    
    
    private:
        // Variable trame
        QString m_recv;
        QString m_fullTrame;
        bool m_isFull = false;
    
        // Variable reçues
        int reelSpeed;
        int tmpWarning;
        int consoNRJ;
        int sensRot; // 0 : sens horaire, 1 : sens anti horaire
    
        Ui::MainWindow *ui;
    };
    #endif // MAINWINDOW_H
    

    mainwindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    #include <QSerialPort>
    #include <QDebug>
    #include <QTimer>
    #include <QString>
    #include <QSlider>
    #include <QMessageBox>
    #include <QSerialPortInfo>
    #include <QThread>
    #include <QString>
    #include <QLCDNumber>
    
    //#DEFINE PORT "/dev/ttyUSB0"
    
    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        // Création du port série
        m_port = new QSerialPort(QLatin1String("/dev/tty.usbmodem14103"));
    
        // Paramétrage du port série
        m_port->setBaudRate(QSerialPort::Baud115200);
        m_port->setParity(QSerialPort::NoParity);
        m_port->setDataBits(QSerialPort::Data8);
        m_port->setStopBits(QSerialPort::OneStop);
    
        // Ouverture du port série
        m_port->open(QIODevice::ReadWrite);
        qDebug("<debug> etat ouverture port : %d", m_port->isOpen());
    
        // connect(m_port, SIGNAL(readyRead()), this, SLOT(handleReadyRead())); Commentez pour test de la fonction décrypt
    
        handleReadyRead();
    
        // Fermeture du port série
        // closePort();
    
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::sendData(const QString &trame) {
            if (m_port == NULL || !m_port->isOpen())
            {
                return;
            }
    
            m_port->write(trame.toLatin1());
    }
    
    
    
    void MainWindow::listenData() {
    
    
    }
    
    
    void MainWindow::closePort() {
        // Fermeture du port série
        m_port->close();
        qDebug("<debug> etat ouverture port : %d", m_port->isOpen());
    
        delete m_port;
    }
    
    
    void MainWindow::changeRotation() {
        qDebug("Changement de sens de rotation");
    }
    
    
    
    void MainWindow::handleReadyRead()
    {
        /*QString S_message = QString::fromLatin1(m_port->readAll());
    
        m_recv += S_message;
    
        if (m_recv.endsWith("\n") == true) {
            m_fullTrame = m_recv;
            m_recv = "";
            m_isFull = true;
    
        }*/ // Commenté pour but de test
    
        m_fullTrame = "234 43 0 0";
        m_isFull = true;
    
        qDebug() << m_fullTrame;
    
        if (m_isFull == true) {
            decryptTrame();
        }
    }
    
    
    
    void MainWindow::decryptTrame() {
        /*
         * // Variable reçues
         * int reelSpeed = 0;
         * int consoNRJ = 0;
         * int sensRot = 0; // 0 : sens horaire, 1 : sens anti horaire
         * int tmpWarning = 0;
         */
    
        qDebug() << "Entrée dans decrypt";
    
        QStringList data = m_fullTrame.split(" ");
        reelSpeed = ((QString)data[0]).toInt();
        consoNRJ = ((QString)data[1]).toInt();
        sensRot = ((QString)data[2]).toInt();
        tmpWarning = ((QString)data[3]).toInt();
    
        qDebug() << "Post traitement data";
    
        ui->dspSpeed->display(reelSpeed); // Ligne qui fait crasher l'app
    
        qDebug() << "Post display 1";
    
        ui->dspNRJ->display(consoNRJ);
    
        qDebug() << "Post display 2";
    
        /*if (((ui->rotHoraire->isChecked() == true) && (sensRot == 0)) || ((ui->rotAntiHoraire->isChecked() == true) && (sensRot == 1))) {
            qDebug("Sens de rotation ok");
        }
        else {
            warningRot();
        }*/
    
        if (tmpWarning == 1) {
            warningTemp();
        }
    
        qDebug("End decrypt");
    
    }
    
    
    void MainWindow::warningTemp(){
        QMessageBox::information(this, "Warning température", "La température du moteur dépasse la limite authorisée, arrêt du moteur en cours.");
        ui->speedSelector->setValue(0);
    }
    
    
    
    void MainWindow::warningRot() {
        QMessageBox::information(this, "Problème sens de rotation", "Le sens de rotation du moteur ne correspond pas à la commande. Remise à zéro des commandes du moteur.");
        ui->speedSelector->setValue(0);
        ui->rotHoraire->setChecked(true);
        ui->rotAntiHoraire->setChecked(false);
    }
    




    • Partager sur Facebook
    • Partager sur Twitter
      12 octobre 2020 à 17:09:01

      Quand tu fais générer l'interface par le designer et son compilateur "uic", les widgets sont alloués par la fonction setupUi, donc le code qui a besoin d'accéder à ces widgets (ex: "handleReadyRead" dans ton cas) doit être appelé après l'appel à cette fonction.

      En pratique,

      ui->setupUi(this);

      devrait probablement être la première ligne de ton constructeur.



      • Partager sur Facebook
      • Partager sur Twitter
        12 octobre 2020 à 19:31:25

        Problème résolu, merci de tout coeur !
        • Partager sur Facebook
        • Partager sur Twitter

        Qt5 LCDNumber->display() fait crasher l'app

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown