Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec QSerialport reconnexion

    19 septembre 2019 à 20:11:36

    Bonjour je viens vers vous car j'ai un petit problème je développe un premier programme avec Qt et lors de mes test je m'aperçoit que si je déconnecte mon Arduino avec port->close() il m'est impossible de me reconnecter par la suite sauf si je débranche la carte et rebranche ou en relançant le programme,
    la fonction write() me retourne QIODevice::write (QSerialPort): device not open
    auriez vous des solutions?
    à noter que pour la connexion je me suis inspiré de ce tuto, que l'envoi de donnée fonctionne

    http://tvaira.free.fr/projets/activi...ts-disponibles

    merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      20 septembre 2019 à 22:35:00

      peut être que le code vous aidera à m'aidez un peu plus, petit probleme de plus quand je change de couleur
       avec la palette je peux envoyer le changement de couleur mais qu'une seul fois

      generalsetting.cpp

      #include "generalsetting.h" #include<QDebug> generalsetting::generalsetting() { setWindowTitle("Réglage Table"); // 1 : Créer le QTabWidget QTabWidget *onglets = new QTabWidget(this); onglets->setGeometry(30, 20, 500, 300); // 2 : Créer les pages, en utilisant un widget parent pour contenir chacune des pages QWidget *page1 = new QWidget; QWidget *page2 = new QWidget; QLabel *page3 = new QLabel; // Comme un QLabel est aussi un QWidget (il en hérite), on peut aussi s'en servir de page QLabel *labelbaud = new QLabel("Baudrates:"); QLabel *labelport= new QLabel("Port:"); // 3 : Créer le contenu des page de widgets // Page 1 listebaud = new QComboBox(this); listebaud->addItem("9600"); listebaud->addItem("19200"); listebaud->addItem("38400"); listebaud->addItem("57600"); listebaud->addItem("74880"); listebaud->addItem("115200"); listebaud->addItem("230400"); listebaud->addItem("250000"); listebaud->addItem("500000"); listebaud->addItem("1000000"); listebaud->addItem("2000000"); QVBoxLayout *vbox1 = new QVBoxLayout; QHBoxLayout *Hbox1a = new QHBoxLayout; QHBoxLayout *Hbox1b = new QHBoxLayout; QHBoxLayout *Hbox1c = new QHBoxLayout; page1->setLayout(vbox1); vbox1->addLayout(Hbox1a); vbox1->addLayout(Hbox1b); vbox1->addLayout(Hbox1c); listeport = new QComboBox(this); buttonok = new QPushButton("Connection",this); buttonok->setEnabled(false); QWidget::connect(listeport, SIGNAL(currentIndexChanged(int)), this, SLOT(Degriser(int))); QWidget::connect(buttonok, SIGNAL(clicked()), this, SLOT(connectionArduino())); QPushButton *boutonannuler = new QPushButton("Annuler"); Hbox1c->addWidget(buttonok); Hbox1c->addWidget(boutonannuler); Hbox1a->addWidget(labelbaud); Hbox1a->addWidget(listebaud); Hbox1b->addWidget(labelport); Hbox1b->addWidget(listeport); QObject::connect(boutonannuler, SIGNAL(clicked()),this, SLOT(reject())); // Page 2 QProgressBar *progress = new QProgressBar; progress->setValue(50); QSlider *slider = new QSlider(Qt::Horizontal); QPushButton *bouton3 = new QPushButton("Valider"); QVBoxLayout *vbox2 = new QVBoxLayout; vbox2->addWidget(progress); vbox2->addWidget(slider); vbox2->addWidget(bouton3); page2->setLayout(vbox2); // Page 3 (je ne vais afficher qu'une image ici, pas besoin de layout) page3->setPixmap(QPixmap("icone.png")); page3->setAlignment(Qt::AlignCenter); // 4 : ajouter les onglets au QTabWidget, en indiquant la page qu'ils contiennent onglets->addTab(page1, "Connexion Arduino"); onglets->addTab(page2, "Télécommande"); onglets->addTab(page3, "About"); } void generalsetting::connectionArduino() { if ((currentport != "Selection du port")&& (etatconnection != "Connect")) { QString string(listebaud->currentText()); bool ok = false; int nombre = string.toInt(&ok, 10); if( ok ){ qDebug()<<"Nombre vaut :" << nombre; qDebug()<<"Erreur"<<nombre; } else { qDebug()<<"Erreur"; } accesport = new QSerialPort(currentport); accesport->open(QIODevice::ReadWrite); accesport->setBaudRate(nombre); accesport->setDataBits(QSerialPort::Data8); accesport->setParity(QSerialPort::NoParity); accesport->setStopBits(QSerialPort::OneStop); accesport->setFlowControl(QSerialPort::NoFlowControl); buttonok->setText("Déconnection"); etatconnection = "Connect"; listeport->setEnabled(false); listebaud->setEnabled(false); QMessageBox::information(this, "Connection Réussi", "Vous êtes connecté"); etatport=1; } else if (etatconnection == "Connect") { accesport = new QSerialPort(currentport); emit accesport->aboutToClose(); accesport->close(); qDebug("<debug> etat ouverture port : %d", accesport->isOpen()); delete accesport; etatconnection = "Deconnect"; buttonok->setText("Connection"); listeport->setEnabled(true); listebaud->setEnabled(true); QMessageBox::information(this, "Déconnection Réussi", "Vous êtes déconnecté"); etatport=0; } else { QMessageBox::information(this, "Connection Impossible", "Un problème empèche la connection"); } } void generalsetting::Degriser(int signalgriser) { if(etatport==0) { if (signalgriser == 0) { if(etatport==0) { buttonok->setEnabled(false); } currentport = (listeport->currentText()); } else { buttonok->setEnabled(true); currentport = (listeport->currentText()); } } } void generalsetting::errorconnection() { qDebug()<< accesport; } void generalsetting::actualise_port() { if (etatport==0) { qDebug() <<"cocuou"; for (int i=oldliste; i > 0;i--) { listeport->removeItem(i); } listeport->removeItem(0); QList<QSerialPortInfo> listePorts; QStringList listePortsDisponibles; listeport->addItem("Selection du port"); listePorts = QSerialPortInfo::availablePorts(); for (int i=0; i < listePorts.size();i++) { QSerialPortInfo info = listePorts.at(i); { listePortsDisponibles << info.portName(); listeport->addItem(info.portName()); } } oldliste=listePorts.size(); } } void generalsetting::envoiArduinoaperio(int) { if(etatport==0) { QMessageBox::information(this, "Pas de Connexion", "Vous n'êtes pas connecté"); } else { // instancie un objet QTimer timer = new QTimer(this); // connecte le signal timeout() au slot envoyer() connect(timer, SIGNAL(timeout()), this, SLOT(envoyer())); // démarre le timer (la période s'expime en millisecondes) timer->start(10000); // toutes les secondes // ... // arrête le timer if(timer->isActive()) { timer->stop(); } } } void generalsetting::emettrearduino(QString trame) { int nombresOctets = -1; if (accesport == nullptr || etatport==0) { QMessageBox::information(this, "Pas de Connexion", "Vous n'êtes pas connecté"); return; } nombresOctets = accesport->write(trame.toLocal8Bit()); qDebug() << "coucou c'ets moi"<<nombresOctets; }
      generalsetting.h
      #ifndef generalsetting_H
      #define generalsetting_H
      
      #include <QDialog>
      #include<QTabWidget>
      #include<QLabel>
      #include<QLineEdit>
      #include<QVBoxLayout>
      #include<QProgressBar>
      #include<QSlider>
      #include<QPushButton>
      #include<QComboBox>
      #include<QString>
      #include<QSerialPortInfo>
      #include<QDebug>
      #include<QSerialPort>
      #include<QStateMachine>
      #include<QEventTransition>
      #include<QMessageBox>
      #include<QTimer>
      
      class generalsetting: public QDialog
      {
             Q_OBJECT
      
      public:
          generalsetting();
      
      private:
          QString currentport;
       QSerialPort *accesport;
        QString *port;
        QComboBox *listeport;
        QPushButton *buttonok;
          QString etatconnection ;
          QComboBox *listebaud;
          QList<QSerialPortInfo> *listePorts;
          QStringList * listePortsDisponibles;
           QTimer *timer;
      
          int liste=0;
          int oldliste=0;
          int etatport=0;
      
      public slots:
          void connectionArduino();
          void Degriser(int);
          void errorconnection();
          void actualise_port();
          void envoiArduinoaperio(int);
      void emettrearduino(QString);
      };
      
      #endif // SETTING__H
      
      led
      Buttonledpalette.cpp
      #include "buttonledpalette.h"
      #include"generalsetting.h"
      button_ledpalette::button_ledpalette(QWidget *parent)
          :QPushButton(parent)
      {
      
         setText("Changer Couleur des LEDs");
         setCursor(Qt::PointingHandCursor);
      
      }
      
      void button_ledpalette::envoiebutton()
      {
      
      }
      
      void button_ledpalette::paletteopen()
      {
          QColor couleur = QColorDialog::getColor(Qt::white);
          QPalette palette;
         choicecouleur = couleur.name(QColor::HexRgb);
          qDebug() << choicecouleur;
          if (choicecouleur != previouschoicecouleur)
          {
              qDebug() << "envoyer";
              emit changecouleur(choicecouleur);
              previouschoicecouleur=choicecouleur;
          }
      
      
      }

       Buttonledpalette.h

      #ifndef LEDPALETTE_H
      #define LEDPALETTE_H
      
      #include <QApplication>
      #include <QObject>
      #include<QPushButton>
      #include<QColorDialog>
      #include<QDebug>
      class button_ledpalette : public QPushButton // On hérite de QWidget (IMPORTANT)
      {
      
          Q_OBJECT
      
          public:
          button_ledpalette(QWidget *parent);
      
      private:
       QString choicecouleur=nullptr;
      
      QString previouschoicecouleur;
      public slots:
       void paletteopen();
         void envoiebutton();
      signals:
         void changecouleur(QString);
      
      };
      
      #endif // LEDPALETTE_H
      
       
       
      Mainwindow.cpp
      #include "mainwindow.h"
      
      
      
      MainWindow::MainWindow(QWidget *parent)
          : QMainWindow(parent)
      {
              setWindowTitle("Centre de contrôle table tactile");
              setStyleSheet("background-color:black;");
      
               m_mainWidget= new QWidget(this);
               m_layout = new QVBoxLayout(this);
      
               m_settingWidget= new QWidget(m_mainWidget);
      
               QHBoxLayout  *m_toolbar_layout =new QHBoxLayout;
               QHBoxLayout  *m_navigate_layout =new QHBoxLayout;
               QHBoxLayout  *m_ledcolor_layout =new QHBoxLayout;
               QHBoxLayout  *m_Bouton_layout =new QHBoxLayout;
      
              QSpacerItem *spacer = new QSpacerItem(20, 0, QSizePolicy::Expanding, QSizePolicy::Preferred);
              QSpacerItem *spacerV = new QSpacerItem(0, 50, QSizePolicy::Ignored, QSizePolicy::Expanding);
      
      
              m_mainWidget->setLayout(m_layout);
              m_layout->addLayout(m_toolbar_layout);
              m_layout->addLayout(m_navigate_layout);
              m_layout->addLayout(m_ledcolor_layout);
              m_layout->addLayout(m_Bouton_layout);
      
      
              navigatefenetre *button_nav_left= new navigatefenetre(m_mainWidget,"images/fleche_gauche.png");
              navigatefenetre *button_navright= new navigatefenetre(m_mainWidget,"images/fleche_droite.png");
              button_ledpalette *btnpalette = new button_ledpalette(m_mainWidget);
              top_navbar *btnquit = new top_navbar(m_mainWidget, "images/boutonclose.png");
              top_navbar *btnsetting = new top_navbar(m_mainWidget, "images/icoreglage.png");
              QLabel *Status_Arduino = new QLabel("Status Arduino:");
              top_navbar *statusconnecte = new top_navbar(m_mainWidget, "images/statusconnect.png");
              top_navbar *statusimpossible = new top_navbar(m_mainWidget, "images/comunicationimpossible.png");
              top_navbar *statusdeconnecte = new top_navbar(m_mainWidget, "images/status deconnecter.png");
      
              m_toolbar_layout->addItem(spacer);
              m_toolbar_layout->addWidget(Status_Arduino);
              Status_Arduino->setStyleSheet("color:white;");
               m_toolbar_layout->addWidget(statusimpossible);
                m_toolbar_layout->addWidget(statusconnecte);
                 m_toolbar_layout->addWidget(statusdeconnecte);
              m_toolbar_layout->addItem(spacer);
              m_toolbar_layout->addWidget(btnsetting);
              m_toolbar_layout->addWidget(btnquit);
      
              m_navigate_layout->addWidget(button_nav_left);
              m_navigate_layout->addItem(spacer);
              m_navigate_layout->addWidget(button_navright);
              m_navigate_layout->addItem(spacerV);
      
      
              m_ledcolor_layout->addItem(spacer);
              m_ledcolor_layout->addWidget(btnpalette);
              btnpalette->setStyleSheet("background-color:white;");
              m_ledcolor_layout->addItem(spacer);
              m_ledcolor_layout->addItem(spacerV);
              m_layout->addItem(spacerV);
      
              setCentralWidget(m_mainWidget);
              generalsetting *buttonsetting= new generalsetting();
              QObject::connect(btnpalette, SIGNAL(clicked()), btnpalette, SLOT(paletteopen()));
              QObject::connect(btnquit, SIGNAL(clicked()),qApp, SLOT(quit()));
                  QWidget::connect(btnsetting, SIGNAL(clicked()), buttonsetting, SLOT(actualise_port()));
              QWidget::connect(btnsetting, SIGNAL(clicked()), buttonsetting, SLOT(exec()));
              QObject::connect(btnpalette, SIGNAL(changecouleur(QString)),buttonsetting, SLOT(emettrearduino(QString)));
      
      
      };
      
      
      MainWindow::~MainWindow()
      {
      }
      

      MainWindow.h

      et enfin le main.cpp
      #include "mainwindow.h"
      #include"ledpalette.h"
      #include"navigatefenetre.h"
      #include"buttonledpalette.h"
      #include "degrisebouton.h"
      
      
      #include <QApplication>
      #include <QSerialPort>
      #include <QSerialPortInfo>
      #include <QDebug>
      
      
      int main(int argc, char *argv[])
      {
          QApplication a(argc, argv);
          MainWindow w;
      
          w.show();
      
       return a.exec();
      }
      
      • Partager sur Facebook
      • Partager sur Twitter

      Problème avec QSerialport reconnexion

      × 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