Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QserialPort



  • Bonjour j'ai écrit un programme qui me permet de lire des données que m'envois ma carte Arduino via le port série, je voulais vous montrer mon code pour que vous me conseillez sur ce qui ne va pas, le code marche, j'arrive à recevoir toutes les données, en fait les données envoyées par la carte Arduino sont les valeurs de trois potentiomètres et l'état de deux boutons poussoirs. Je voulais savoir s'il y'a une meilleure technique pour faire le traitement Merci.
    voici mon code:

    void fenetre_principal::save_donnee()
    {
    QByteArray donnees;
     if(m_port->bytesAvailable()>=9)
    {
         while(continu)
       {
             qDebug()<<"i m in while\n";
             if(m_port->peek(2).toInt()!=-1){
            m_port->getChar(nullptr);
        }
            else
          {
            m_port->getChar(nullptr);
             m_port->getChar(nullptr);
    
            qDebug()<<"debut_trame\n";
    
            while(m_port->peek(2).toInt()!=-2)
            {
    qDebug()<<"enter\n";
                if(m_port->bytesAvailable())
                    donnees.push_back(m_port->read(1));
                else
                    break;
            }
            m_port->getChar(nullptr);
              m_port->getChar(nullptr);
            qDebug()<<"fin_trame\n";
            //if(!m_port->bytesAvailable())
            continu=false;
    
           }
    
        }
         continu=true;
    dispatch(donnees);
    donnees.clear();
    
     }
        else
          return;
    
    }
    

  • Lifetime Qt Champion

    Bonjour et bienvenu sur devnet,

    Plutôt que d'avoir une boucle presque infinie comme ça, le plus simple serai d'utiliser la nature asynchrone de QSerialPort. A chaque fois que des données arrivent, les cumuler dans un buffer. Ensuite vérifier si le buffer contient une trame, si oui, l'extraire et la traiter et recommencer jusqu'à ce qu'il n'y ait plus de trame disponible.



  • @SGaist bonsoir merci pour votre réponse d'accord je vais essayer comme tu as dit, exactement je voulais me débarrasser du while et le fait d'attendre qu'il ait 9 octets pour faire un traitement.



  • bonjour j'ai réécrit mon programme comme vous me l'avez conseillé, ça marche!
    si vous avez d'autres suggestions , proposez les Svp Mercii

    void fenetre_principal::save_donnee()
    {
       m_buffer.push_back(m_port->readAll());
       QByteArray send{0};
           while(m_buffer.contains("-1")&&m_buffer.contains("-2"))
       {int r(0);
    
               for (int i(m_buffer.indexOf("-1")+2);i<(m_buffer.indexOf("-2"));i++)
               {
                   send.push_back(m_buffer[i]);
                   r++;
               }
                   m_buffer.remove(m_buffer.indexOf("-1"),r+4);
    
               dispatch(send);
       }
           qDebug()<<"out\n";
    }
    
    

  • Lifetime Qt Champion

    Quel est le type the m_buffer ?



  • @SGaist bonsoir m_buffer est un QbyteArray


Log in to reply