Partage
  • Partager sur Facebook
  • Partager sur Twitter

Communication série Qt - Arduino

Comment afficher le string envoyé vers Arduino

    5 avril 2019 à 15:42:08

    Bonjour, je viens de commencer un stage et le début consiste à la prise en main des codes Qt et Arduino laissés par l'ancien stagiaire. Il y a deja quelques soucis de fonctionnement dans le code et j'aurais besoin de votre aide pour m'en sortir car je ne connais pas très bien la communication série.

    Un contexte rapide (je vais essayer), je suis en charge de finaliser la conception et l'asservissement d'un banc de calibration. Ce banc est composé de trois moteurs pas à pas pour déplacer l'appareil à calibrer sur les trois directions. La commande des moteurs se fait avec une carde Arduino Due et l'interface homme machine est faite avec Qt. On veut pouvoir faire avancer un axe par pas de 1mm, 0.1mm et 0.01mm, l'interface comporte donc 3 QPushBoutons pour chacune de ces longueurs, qu'on sélectionne avant de cliquer sur le boutoner "Avancer" de l'axe que l'on veut déplacer. Le slot appelé envoie alors une chaine de caractère à l'Arduino en fonction des boutons cochés. Je vous mets juste en dessous les parties du code correspondant a la mise en place de la connection série entre l'Arduino et Qt, la fonction connect et le slot appelé.

    arduino = new QSerialPort;
    
    // Setup de la connection série
    qDebug()<<"Number of available port : " << QSerialPortInfo::availablePorts().length();
    
        foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
            if (serialPortInfo.hasVendorIdentifier()){
                qDebug()<<"ID vendeur : " << serialPortInfo.vendorIdentifier();
            }
            if (serialPortInfo.hasProductIdentifier()){
    
                qDebug() << "ID produit : " << serialPortInfo.productIdentifier();
            }
        }
    
        foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
            if (serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier()){
                if (serialPortInfo.vendorIdentifier() == arduino_due_vendor_id){
                    if (serialPortInfo.productIdentifier() == arduino_due_product_id){
                        arduino_port_name = serialPortInfo.portName();
                        arduino_is_available = true;
                        qDebug() << "Port name : " << arduino_port_name;
                    }
                }
            }
        }
    
        // Réglage de la communication  série avec l'Arduino
        if (arduino_is_available){
            //open and configure serial port
            arduino->setPortName(arduino_port_name);
            arduino->open(QSerialPort::ReadWrite);
            arduino->setBaudRate(115200);
            arduino->setDataBits(QSerialPort::Data8);
            arduino->setParity(QSerialPort::NoParity);
            arduino->setStopBits(QSerialPort::OneStop);
            arduino->setFlowControl(QSerialPort::NoFlowControl);
            qDebug() << "Port configured";
        }
        else{
            QMessageBox::warning(this, "Port error", "Couldn't find the Arduino");
        }
    
    //Connect du bouton "Avancer" de l'axe X
    connect(advance_x,SIGNAL(pressed()),this,SLOT(advance_x_clicked()));
    
    // SLOT du bouton avancer 
    void ControleMoteur::advance_x_clicked()
    {
    
        if (inc_1mm->isChecked()){
            if(arduino->isWritable()){
                arduino->write("xa1");
                qDebug() << "Ordre envoyé";
            }
            else{
                qDebug() << "Couldn't write on the arduino";
            }
        }
        else if (inc_0_1mm->isChecked()){
            if(arduino->isWritable()){
                arduino->write("xa0.1");
                qDebug() << "Ordre envoyé";
            }
            else{
                qDebug() << "Couldn't write on the arduino";
            }
        }
        else if (inc_0_01mm->isChecked()){
            if(arduino->isWritable()){
                arduino->write("xa0.01");
                qDebug() << "Ordre envoyé";
            }
            else{
                qDebug() << "Couldn't write on the arduino";
            }
        }
    }


    Le problème que je rencontre est dans le cas de deux clicks trop rapides sur le bouton avancer. Si on est sur une avance de 1mm et qu'on double click, l'Arduino ne fait pas avancer de 2mm mais de 11mm !

     La chaine de caractère envoyée vers Arduino a l'appel du slot y est ensuite lue caractère par caractère et je soupçonne fort que les deux messages soient envoyés trop rapidement et qu'ils se superposes/mélanges à l'arrivée vers Arduino ce qui fait que l'Arduino va me lire un 11 au lieu de voir deux fois 1 distinctement.

    Pour essayer de régler le problème j'aurais donc besoin de faire afficher ce que l'Arduino reçoit exactement (pas ce que Qt envoie, car je pense que c'est justement pendant le transfert d'info que le problème apparait), mais il est impossible d'ouvrir moniteur série d'Arduino pour consulter d'éventuels Serial.println(….).

    Quelqu'un aurait-il une solution pour consulter la chaine de caractère reçu par Arduino ?

    J'ai conscience de poster sur le forum C++ alors que la solution viendra probablement de ligne de code dans Arduino mais je me suis dit que j'aurais plus de chance de trouver une personne callée en Qt et qui maitrise aussi l'Arduino que l'inverse ...

    Merci d'être arrivé au bout de mon pavé et merci d'avance à ceux qui essayeront de me donner un coup de main ! 

    • Partager sur Facebook
    • Partager sur Twitter
      6 avril 2019 à 0:55:23

      Y a pas mal de soft pour debug ce qui passe sur le serial, le plus simple peut-etre aussi de demander à l'Arduino de renvoyer ce qu'elle lit sur le Serial.

      Sur GNU/Linux, je pense que tu peux le faire à coup de socat + tee sinon. https://aur.archlinux.org/packages/interceptty sinon

      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2019 à 10:50:35

        Oui c'est finalement la méthode pour laquelle j'ai opté depuis ce matin, je reconstruit un string avec tous les caractères reçu dans l'Arduino, je l'envoie vers Qt et je le fais afficher dans un QTextEdit de ma fenêtre.

        Bon … Il m'affiche encore un peu n'importe quoi par contre … mais a ce niveau là je devrais réussir à m'en sortir. Je reviendrai ici poser quelques questions si c'est pas le cas. Merci pour ta réponse en tout cas ! :)

        • Partager sur Facebook
        • Partager sur Twitter

        Communication série Qt - Arduino

        × 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