IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Faire une boucle par appui sur un bouton

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut Faire une boucle par appui sur un bouton
    Bonjour à tous,

    J'ouvre un nouveau post pour traiter d'un nouveau sujet .
    Je suis toujours dans l'application pour faire avancer mon robot. Jusque la ca avance tranquillement. Quand j’appuie sur un bouton - "Bouton_Avance" ) , les ordres sont bien envoyés au port série .


    J'essaye aujourd'hui d’envoyer plusieurs trames à la suite ! et oui si je laisse mon bouton appuyé il me faut une boucle qui envoie sans cesse la trame pour avancer. Ainsi tant que je reste clicker sur mon bouton cela envoie des trames au ports qui fait avancer mon robot.

    Pour y aller doucement, je me disais que j'allais commencer par envoyer 10 trames à la suite ( espacées de 50 millisecondes)

    Voici mon travail jusqu’à présent : ce code ne fonctionne pas; il envoie qu'"une seule trame ? et s'arrete .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /********************************************************
       Cette fonction envoi la trame pour AVANCER
    ********************************************************/
    void MainWindow::on_Bouton_Avance_pressed()
    {
     
            QByteArray ba ;  //je creer un tableau de bytes
            ba.resize(10);	// Je lui affecte 10 cases
            ba[0] = 2;		// je le remplis de ma série de bytes
            ba[1] = 0;
            ba[2] = 6;
            ba[3] = 150;
            ba[4] = 128;
            ba[5] = 128;		// je le remplis de ma série de bytes
            ba[6] = 128;
            ba[7] = 0;
            ba[8] = 128;
            ba[9] = 146;
     
            for (int i=0;i<10;i++)
            {
               serial.write(ba); // J'envoie la trame au port serie
               QThread::msleep(50);
            }
     
    }
    Je ne comprends pas pourquoi la boucle n'est pas exécuter 10 fois ? l a trame est envoyé une seule fois après un délais de quelques centaines de millisecondes ?

    Auriez vous une solution à me proposer ou une piste ?

  2. #2
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Bonjour.

    serial est de quel type ? Si c'est un QSerialPort, tu peux vérifier que la valeur renvoyée par write() (le nombre de bytes envoyés) est bien égale à 10.

    QPushButton peut être configuré pour répéter l’événement push, via auto repeat, auto repeat delay et auto repeat interval. C'est plus propre que de faire une boucle+sleep dans la fonction slot selon moi.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Bonjour Daïmanu,

    Merci de t'être penché sur mon probléme.

    Oui "serial" est de type "QSerialPort" . Par contre je n'ai pas compris ce que tu me demande faire. N'ayant que 2 jours de pratique sur Qt, je galère pas mal avec les termes propres a ce langage.
    Énormément de confusion entres les méthodes les attributs le variables les fonctions les déclarations...

    Je ne sais donc pas comment m'y prendre.

    Concernant l'astuce du "QPushButton", via l'auto repat avec intervalle ce serait parfait dans mon cas. Bien plus simple, propre, pratique et facile Je valide .

    Je vais de ce pas essayer ta solution et je reviens ici pour rendre compte !

    Merci



    PS: je lis une deuxième fois les cours d'open classroom, pour essaye de m’intégrer au mieux des notions de bases. mais la doc de Qt est perturbante.

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Bonjour ,

    La solution pour la bouton avec le repeat fonctionne parfaitement .

    Maintenant quand je laisse le bouton appuyer les trames partent en se répétant et mon robot avacne tant que je reste appuyé sur le bouton.

    Je voulais aller plus loin. mais il se passe un truc bizarre donc je ne comprends toujours pas le phénomène. Je pense que comme je viens du C sur micro-contrôleur ma logique n'est pas affinée du point de vue POO .

    En réalité, il faut que j’envoie un trame quand je clic sur le bouton avance .
    Tant que je reste clické sur le Bouton la trame doit être envoyée .
    Mais quand je relâche le Bouton, je souhaiterais qu'une trame différente soit envoyée ( pour arrêter les moteurs).

    J'ai créer une autre méthode pour envoyer une trame différente quand le bouton est relâché !
    Mais maintenant le robot avance d'une trame et s’arrête tout de suite.

    J'ai donc analyser les signaux arrivant sur mon robot . On voit clairement que la première trame est avec la valeur pour le faire avancer (150) et que les trames suivantes, il s’arrête ( toutes à 128 qui correspond au point mort).

    Nom : Sans titre.jpg
Affichages : 282
Taille : 42,5 Ko

    J'en déduis que c'est donc dans mon déroulé de programme que quelques chose est mal construit.

    SI j’enlève la méthode "on_Bouton_Avance_released()" ca fonctionne bien. pour quoi est ce que le programme rentre dans cette fonction, alors que le bouton n'est pas relâché ?

    Je suis vraiment débutant , pas mal de truc m'échappe sur la construction d'un tel programme. De plus venant du langage "C" je perds tout mes repères.
    N’hésitez pas à me dire comment mieux agencé mon programme.

    Je suis pas mloin de tout arreter, il me faut un peu d'aide les gars SVP .

    Voila mon bazar;

    mainwindow.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #ifndef MAINWINDOW_H
     
    #define MAINWINDOW_H
     
    #include <QMainWindow>
    #include <QApplication>
    #include <QSerialPortInfo>
    #include <QSerialPort>
    #include <QDebug>
     
    namespace Ui {
    class MainWindow;
    }
     
      class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
     
    //********************************************************************************************************
    // Ici je créer mes slots public pour que l'utilisateur puisse s'en servir
    //********************************************************************************************************
      public slots:
          void on_Bouton_Avance_released();
          void on_Bouton_Avance_pressed();     //slot click du bouton quand on click sur le bouton pour avancer
          void on_BoutonConnexion_clicked();   // slot pour se connecter au port
          void on_BoutonDeconnexion_clicked(); // slot pour se DEconnecter du au port
     
    //********************************************************************************************************
    // Ici je créer des attributs privés pour ne pas que les utilisateurs puissent les modifiés
    //********************************************************************************************************
    private:
        Ui::MainWindow *ui;
        QSerialPort serial;		// Je créer un attribut de type QSerialPOrt que je nomme "serial"
        QByteArray trame;   // Je creer un attribut de type tableau de bytes
     };
     
    #endif // MAINWINDOW_H
    main.ccp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "mainwindow.h"
    #include <QApplication>
    #include <QSerialPortInfo>
    #include <QSerialPort>
    #include <QDebug>
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
     
        MainWindow w;
        w.show();
     
        return a.exec();
    }
    mainwindow.ccp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QApplication>
    #include <QSerialPortInfo>
    #include <QSerialPort>
    #include <QDebug>
    #include <QThread>
    #include <QIODevice>
     
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this); // Je créee ma fenetre avec le fichier forms
     
     
        // Au démarrage je cache le bouton de déconnexion
        ui->BoutonDeconnexion->setVisible(false);
     
        // Je récupére les ports disponibles
        QList<QSerialPortInfo> com_ports = QSerialPortInfo::availablePorts();
        QSerialPortInfo port;// Je créer un attribut de type "QSerilPort nommé "port"
        foreach(port, com_ports) // Je remplis la combobox avec la liste des ports disponibles
        {
            ui->Combo_Port->addItem(port.portName());
        }
    }
     
    MainWindow::~MainWindow()
    {
        delete ui;
    }
     
    /**************************************************************************
       Cette fonction envoi la trame pour ARRETER quand on relache le Bouton
    **************************************************************************/
    void MainWindow::on_Bouton_Avance_released()
    {
       // Je stoppe les moteurs
        //je creer un tableau de bytes pourt stocker ma trame à envoyer
        QByteArray trame_arret;
        trame_arret.resize(10);	// Je lui affecte 10 cases
        trame_arret[0] = 2;		// je le remplis de ma série de bytes
        trame_arret[1] = 0;
        trame_arret[2] = 6;
        trame_arret[3] = 128;
        trame_arret[4] = 128;
        trame_arret[5] = 128;		// je le remplis de ma série de bytes
        trame_arret[6] = 128;
        trame_arret[7] = 0;
        trame_arret[8] = 128;
        trame_arret[9] = 132;
     
        serial.write(trame_arret); // J'envoie la trame au port serie
     
     
    }
     
    /**************************************************************************
       Cette fonction envoi la trame pour AVANCER quand on clic sur le Bouton
       Le Bouton est configuré en auto-repaeat avec delay 100ms
    **************************************************************************/
    void MainWindow::on_Bouton_Avance_pressed()
    {
       //je creer un tableau de bytes pourt stocker ma trame à envoyer
       QByteArray trame;
       trame.resize(10);	// Je lui affecte 10 cases
       trame[0] = 2;		// je le remplis de ma série de bytes
       trame[1] = 0;
       trame[2] = 6;
       trame[3] = 150;
       trame[4] = 128;
       trame[5] = 128;		// je le remplis de ma série de bytes
       trame[6] = 128;
       trame[7] = 0;
       trame[8] = 128;
       trame[9] = 146;
     
       serial.write(trame); // J'envoie la trame au port serie
     
            /* ZONE DE TEST
               unsigned char Trame[]={2,0,6,150,128,128,128,0,128,146};
               serial.write(Trame[0]);
               qint64 QIODevice::write(arraybytes[], 10);
               serial.write(arraybytes[0]); // J'envoie la trame au port serie
               QIODevice::write(arraybytes[0], 10);
            */
    }
     
     
    /****************************************************************************
    Cette fonction Connecte le port selectionné dans la combobox et le configure
    ****************************************************************************/
    void MainWindow::on_BoutonConnexion_clicked()
    {
      // Je determine le nom du PORT COM par ce qui est selectionné dans la combobox
      serial.setPortName(ui->Combo_Port->currentText());
     
      // Je convertie en une valeur int, le texte selectionné dans la combo-box baud
      int Valeur = ui->Combo_Baud->currentText().toInt();
      serial.setBaudRate(Valeur); // Je determine la valeur du baudrate
     
      // J'ouvre le PORT COM
      if(serial.open(QIODevice::ReadWrite))    // Si le port est correctement ouvert je le configure
        {
          if(!serial.setDataBits(QSerialPort::Data8))
              qDebug()<<serial.errorString();
     
          if(!serial.setParity(QSerialPort::NoParity))
              qDebug()<<serial.errorString();
     
          if(!serial.setStopBits(QSerialPort::OneStop))
              qDebug()<<serial.errorString();
     
          if(!serial.setFlowControl(QSerialPort::NoFlowControl))
              qDebug()<<serial.errorString();
     
          // JE signale à la console que le port est ouvert
          qDebug()<<"Le PORT"<<ui->Combo_Port->currentText()<<" est ouvert ";
          //Je modifie les Boutons
          ui->BoutonConnexion->setVisible(false);
          ui->BoutonDeconnexion->setVisible(true);
        }
        else   // Si le port n'as pas été ouvert je l'indique
        {
             qDebug()<<"PORT"<<ui->Combo_Port->currentText()<<" n'a pas été ouvert. Erreur: "<<serial.errorString();
             //Je modifie les Boutons
             ui->BoutonConnexion->setVisible(true);
             ui->BoutonDeconnexion->setVisible(false);
      }
    }
    /********************************************************
       Cette fonction ferme la connexion
    ********************************************************/
    void MainWindow::on_BoutonDeconnexion_clicked()
    {
        ui->BoutonConnexion->setVisible(true);    // J'affcihe le >Btn connexion
        ui->BoutonDeconnexion->setVisible(false); // JE cache le Btn déconnexion
        qDebug()<<"La connexion du PORT"<<ui->Combo_Port->currentText()<<" est fermée";
        serial.close();
    }
    et mon mainwindow.ui:
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QComboBox" name="Combo_Port">
        <property name="geometry">
         <rect>
          <x>10</x>
          <y>20</y>
          <width>69</width>
          <height>21</height>
         </rect>
        </property>
       </widget>
       <widget class="QPushButton" name="BoutonConnexion">
        <property name="geometry">
         <rect>
          <x>290</x>
          <y>10</y>
          <width>101</width>
          <height>31</height>
         </rect>
        </property>
        <property name="text">
         <string>Se Connecter</string>
        </property>
       </widget>
       <widget class="QPushButton" name="BoutonDeconnexion">
        <property name="geometry">
         <rect>
          <x>290</x>
          <y>10</y>
          <width>101</width>
          <height>31</height>
         </rect>
        </property>
        <property name="cursor">
         <cursorShape>PointingHandCursor</cursorShape>
        </property>
        <property name="text">
         <string>Deconnexion</string>
        </property>
       </widget>
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>20</x>
          <y>0</y>
          <width>28</width>
          <height>16</height>
         </rect>
        </property>
        <property name="font">
         <font>
          <pointsize>10</pointsize>
         </font>
        </property>
        <property name="text">
         <string>Port:</string>
        </property>
       </widget>
       <widget class="QComboBox" name="Combo_Baud">
        <property name="geometry">
         <rect>
          <x>100</x>
          <y>20</y>
          <width>69</width>
          <height>22</height>
         </rect>
        </property>
        <property name="currentIndex">
         <number>4</number>
        </property>
        <item>
         <property name="text">
          <string>300</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>1200</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>2400</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>4800</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>9600</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>19200</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>38400</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>57600</string>
         </property>
        </item>
        <item>
         <property name="text">
          <string>115200</string>
         </property>
        </item>
       </widget>
       <widget class="QLabel" name="label_2">
        <property name="geometry">
         <rect>
          <x>110</x>
          <y>0</y>
          <width>47</width>
          <height>13</height>
         </rect>
        </property>
        <property name="text">
         <string>BauRate</string>
        </property>
       </widget>
       <widget class="QPushButton" name="Bouton_Avance">
        <property name="geometry">
         <rect>
          <x>100</x>
          <y>90</y>
          <width>61</width>
          <height>51</height>
         </rect>
        </property>
        <property name="cursor">
         <cursorShape>PointingHandCursor</cursorShape>
        </property>
        <property name="text">
         <string>Avance</string>
        </property>
        <property name="autoRepeat">
         <bool>true</bool>
        </property>
        <property name="autoRepeatDelay">
         <number>100</number>
        </property>
        <property name="autoRepeatInterval">
         <number>100</number>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>400</width>
         <height>21</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>

    Dois-je travaille dans le main.ccp ou alors dans le mainwindow.ccp

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Ma première remarque concerne la fonction QSerialPort::write(const QByteArray&); qui retourne un entier dont la valeur est le nombre de bytes envoyés par cette fonction. L'idée était simplement de vérifier que chaque appel à write retournait bien 10 à chaque fois.

    La documentation de la propriété auto-repeat nous indique que le bouton émet successivement des èvènements pressed(), released(), et clicked(), donc le slot bouton relâché est toujours appelé. J'ai trouvé ici une solution de contournement utilisant la fonction isDown() du bouton : https://stackoverflow.com/a/40002971.

    Et pour répondre à ta dernière question, main.cpp initialise la fenêtre et l'affiche. mainwindow.cpp contient le code de la fenêtre. Donc à priori tu ne dois pas toucher au main, mais ne modifier que la classe MainWindow.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Merci Daïmanu,

    On peut pas dire que tu m'as mâché le travail. moi 'javais lus : "released() is emitted when the left mouse button is released." donc je pensais que l'action était émise seulement quand le bouton était relaché.
    MAis effectivement plus bas on peu lire : "If autoRepeat is enabled, then the pressed(), released(), and clicked() signals are emitted at regular intervals when the button is down. " . Donc quand auto-repeat est actionné le bouton émet aussi la fonction released ce qui ont pas très logique , j’espère que vous en conviendrez ? il repere une action de relâchement alors que le bouton est appuyé.

    Soite cela dit j'ai donc testé dans tout les sens la petite explication.
    et à force de test j'ai réussis à sortir un truc un peu farfelu mais qui fonctionne. J'ai même l'impression d'avoir simplifié la méthode lol. Je l'ai peut etre pas bien interprétée.

    Il rajhoute un bool "isHeld" alors qu'il a exactement la même info avec ?

    J'ai donc modifier mes fonctions comme ca . Je ne passe plus par sa variable bool. Je traite directement avec" isDown" pour savoir si le bouton est appuyé ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    /**************************************************************************
       Cette fonction envoi la trame pour ARRETER quand on relache le Bouton
    **************************************************************************/
    void MainWindow::on_Bouton_Avance_released()
    {
        if( !ui->Bouton_Avance->isDown() )
        {
             QByteArray trame_arret;
            trame_arret.resize(10);	// Je lui affecte 10 cases
            trame_arret[0] = 2;		// je le remplis de ma série de bytes
            trame_arret[1] = 0;
            trame_arret[2] = 6;
            trame_arret[3] = 128;
            trame_arret[4] = 128;
            trame_arret[5] = 128;		// je le remplis de ma série de bytes
            trame_arret[6] = 128;
            trame_arret[7] = 0;
            trame_arret[8] = 128;
            trame_arret[9] = 132;
     
            serial.write(trame_arret); // J'envoie la trame au port serie
        }
        else
        {
            QByteArray trame;
            trame.resize(10);	// Je lui affecte 10 cases
            trame[0] = 2;		// je le remplis de ma série de bytes
            trame[1] = 0;
            trame[2] = 6;
            trame[3] = 150;
            trame[4] = 128;
            trame[5] = 128;		// je le remplis de ma série de bytes
            trame[6] = 128;
            trame[7] = 0;
            trame[8] = 128;
            trame[9] = 146;
            serial.write(trame); // J'envoie la trame au port serie
        }
    }
     
    /**************************************************************************
       Cette fonction envoi la trame pour AVANCER quand on clic sur le Bouton
       Le Bouton est configuré en auto-repaeat avec delay 100ms
    **************************************************************************/
    void MainWindow::on_Bouton_Avance_pressed()
    {
        if( ui->Bouton_Avance->isDown() )
           {
               //isHeld = true;
               QByteArray trame;
               trame.resize(10);	// Je lui affecte 10 cases
               trame[0] = 2;		// je le remplis de ma série de bytes
               trame[1] = 0;
               trame[2] = 6;
               trame[3] = 150;
               trame[4] = 128;
               trame[5] = 128;		// je le remplis de ma série de bytes
               trame[6] = 128;
               trame[7] = 0;
               trame[8] = 128;
               trame[9] = 146;
               serial.write(trame); // J'envoie la trame au port serie
           }
        else
        {
            QByteArray trame_arret;
            trame_arret.resize(10);	// Je lui affecte 10 cases
            trame_arret[0] = 2;		// je le remplis de ma série de bytes
            trame_arret[1] = 0;
            trame_arret[2] = 6;
            trame_arret[3] = 128;
            trame_arret[4] = 128;
            trame_arret[5] = 128;		// je le remplis de ma série de bytes
            trame_arret[6] = 128;
            trame_arret[7] = 0;
            trame_arret[8] = 128;
            trame_arret[9] = 132;
            serial.write(trame_arret); // J'envoie la trame au port serie
        }
    }
    Qu'en pensez vous ?

  7. #7
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Citation Envoyé par dje8269 Voir le message
    Donc quand auto-repeat est actionné le bouton émet aussi la fonction released ce qui ont pas très logique , j’espère que vous en conviendrez ?
    Je ne suis on ne peut plus d'accord depuis au moins 2010 (petit coup de vieux au passage). Mais bon le bouton est implémenté comme ça, on a pas trop le choix de faire avec.

    La structure du code me paraît bonne, je mettrais personnellement juste les byte array trame et trame_arret en constantes au niveau de la classe plutôt que de les redéclarer et réinitialiser à chaque fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MainWindow : QMainWindow {
        private:
            QByteArray trame = {2, 0, 6, …};
            QByteArray trame_arret = {2, 0, 6, …};
        public slots:
            …
    };
    Ça devrait alléger le code et le rendre plus lisible.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Re,

    Ok, ça me rassure pour le bouton. Effectivement l'implémentation est bizarre. A partir du moment ou on le sait, pas de probléme je fais avec et on contourne.

    Nous avons la même idée ! pour simplifier , voila deux heures que je cherche à initialiser QBytesArray .
    Comme ce seront des constantes autan les déclarer avant , pour n'avoir qu'a les utiliser avec ma fonction d'envoi. En plus j'ai plusieurs boutons après a faire( il ne fait pas qu'avancer mon robot) .

    Quand j'essaye j'ai toujours des messages d'erreur.

    Il me marque "no matching constructor for intitialization of 'QByteArray' "
    Il faut donc que je fasse un constructeur ? Je vais essayer de trouver comment faire ça.

    J'ai inclus aussi la ligne #include <QByteArray> au début .

    Rien n'y fait .

  9. #9
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 696
    Points : 2 438
    Points
    2 438
    Par défaut
    Ah, on ne peut pas construire de byte array comme ça, my bad.

    Ça a l'air d'être un problème récurrent. J'ai pas de Qt sous la main pour tester, mais une des solutions possibles serait de faire une const char * contenant les nombres au format hexadécimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QByteArray trame = QByteArray("\x02\x00\x06\x96\x80\x80\x80\x00\x80\x92");
    QByteArray trame_arret = QByteArray("\x02\x00\x06\x80\x80\x80\x80\x00\x80\x84");
    À tester.
    Je fais appel aux esprits de Ritchie, Kernighan, Stroustrup et Alexandrescu
    Donnez moi la force, donnez moi le courage de coder proprement !

    « Ça marche pas » n'est PAS une réponse convenable, merci de détailler le souci en fournissant l’environnement, le code source, les commandes et les messages d'erreur.

    Ce club possède également un clavardage, on y trouve quelques perles entre deux sessions d'entraides.

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    LA déclaration fonctionne , je devrais donc pouvoir l'envoyer.

    D'ailleurs je travaille aussi en Hexa, j'ai mis les valeurs en décimales pour éviter de me compliquer les choses. De toutes façon en hexa ou en décimal, la valeur est la même vu de l'ordi ou de mon robot .

    Par contre rien est envoyer quand je clic. ou plus précisément, mon module radio n'envoie rien. Donc il ne reçoit pas la bonne séquence pour émettre !

    JE pense que la mise en forme des hexa est peut être pas la bonne . Je vais fouiller de ce coté ! car pour moi mettre des Hexa entre des guillemets avec un slash devant ça ne me parle pas .

    En tout cas c'est la bonne piste et merci encore de ta patience

  11. #11
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Bon ben, une aprés midi de recherche , et pas de résultat . Impossible pour mon petit niveau de faire mieux que de déclarer a chaque fois et de remplir a chaque fois, pour pouvoir envoyer. Je trouve ça bizarre que ce soit si compliqué .

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Bonjour ,

    Citation Envoyé par Daïmanu Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QByteArray trame = QByteArray("\x02\x00\x06\x96\x80\x80\x80\x00\x80\x92");
    QByteArray trame_arret = QByteArray("\x02\x00\x06\x80\x80\x80\x80\x00\x80\x84");
    À tester.
    Je pense avoir trouvé une piste .

    Ce qui ne va pas avec ton code ce situe au deuxième chiffre hexa . le "\x00" .Comme nous sommes dans une chaine de caractère ( string) je pense que le compilateur prend le "\x00" pour un terminateur de string non ?
    Car en faisant un debug sur la chaine envoyer, il s’arrête après le premier caractère !

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 100
    Points : 41
    Points
    41
    Par défaut
    Je continue mon monologue !!!!!!

    ALLLLEEELLLLUUIIIIIAAAAAAA !!!!

    Je partage ma petite trouvaille en espérant que ça puisse servir à quelqu'un car j’ai bien galérer quand même.

    J'arrvie enfin a déclarer un QByteArray dans mon Header comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private:
        QByteArray trame_Av = QByteArray("\x02\x00\x06\x96\x80\x80\x80\x00\x80\x92",10);
        QByteArray trame_St = QByteArray("\x02\x00\x06\x80\x80\x80\x80\x00\x80\x84",10);
    Et je fais cette méthode dans le .ccp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**************************************************************************
       Cette fonction envoi la trame pour AVANCER quand on clic sur le Bouton
       Le Bouton est configuré en auto-repaeat avec delay 100ms
    **************************************************************************/
    void MainWindow::on_Bouton_Av_pressed()
    {
      if( ui->Bouton_Av->isDown() )
        {
          serial.write(trame_Av);  // J'envoie la trame au port serie
        }
        else
        {
            serial.write(trame_St); // J'envoie la trame au port serie
        }
    }
    Jérémy mode trop content

Discussions similaires

  1. Ouvrir une fenêtre à l'appui sur un bouton
    Par LEROYLudovic dans le forum JavaFX
    Réponses: 1
    Dernier message: 21/12/2017, 20h43
  2. VB6 Arret boucle FOR NEXT par appui sur un bouton
    Par obel38 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 04/01/2011, 16h35
  3. Réponses: 3
    Dernier message: 26/11/2010, 16h27
  4. faire une boucle for..next sur des textbox
    Par Actarusdu60 dans le forum VB.NET
    Réponses: 1
    Dernier message: 28/11/2008, 21h51
  5. Réponses: 3
    Dernier message: 04/04/2007, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo