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

Qt Discussion :

Transmission série vers Arduino


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 17
    Par défaut Transmission série vers Arduino
    Bonjour,

    J'ai trouvé beaucoup de post concernant les problèmes de transmission série avec une Arduino seulement rien ne fonctionne.
    Je m'explique :

    Je souhaite transmettre des lignes de GCode (par exemple : G00 X10 F5) de mon programme Qt vers une Arduino.
    Pour gérer la transmission, j'utilise QSerialPort.
    Lorsque j'envoie la commande mis en exemple ci dessus, une led est sensée s'allumer or elle ne s'allume pas.

    Voici mon code Qt

    Fonction connexion : (Cette fonction fonctionne, j'arrive à me connecter)

    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
    void FenProjet::connexion()
    {
        arduino_is_available = false;
        arduino_port_name = "";
        arduino = new QSerialPort;
     
        foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
        {
                if(serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier())
                {
                    if(serialPortInfo.vendorIdentifier() == arduino_uno_vendor_id)
                    {
                        if(serialPortInfo.productIdentifier() == arduino_uno_product_id)
                        {
                            arduino_port_name = serialPortInfo.portName();
                            arduino_is_available = true;
                        }
                    }
                }
            }
     
        if(arduino_is_available)
        {
               // open and configure the serialport
               arduino->setPortName(arduino_port_name);
               arduino->open(QSerialPort::ReadWrite);
               arduino->setBaudRate(QSerialPort::Baud115200);
               arduino->setDataBits(QSerialPort::Data8);
               arduino->setParity(QSerialPort::NoParity);
               arduino->setStopBits(QSerialPort::OneStop);
               arduino->setFlowControl(QSerialPort::NoFlowControl);
               QMessageBox::information(this, "Info Port", "Connection with Arduino is done");
         }
        else
        {
               // give error message if not available
               QMessageBox::warning(this, "Port error", "Couldn't find the Arduino!");
         }
    }
    Fonction d'envoi :
    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
    void FenProjet::envoie(char trame)
    {
            QByteArray byte; //byte a envoyer
            qint64 bw = 0; //bytes really writen
     
            byte.clear(); // on efface le contenu de byte
            byte.append(trame); // on ajoute "value" a byte
     
            if(arduino != NULL && arduino->isWritable() ){ // on vérifie que le port existe toujours
                bw = arduino->write(byte); // on écrit les byte
                //(bw récupere le nombre de byte écris)
                qDebug() << bw << "byte(s) written | Value sent:" << trame ;
                arduino->flush(); // on attend la fin de la transmission
            }
     
    }
    Code Arduino :

    Fonction réception de données :
    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
    // reception serie
      while(Serial.available() > 0) {  // tant qu'un caractere dans la file d'attente serie
     
        char c=Serial.read();  // lecture du caractere suivant
        //Serial.print(c);  // affichage 
     
        if(sizeIn<MAX_BUF) buffer[sizeIn++]=c;  // on le memorise dans le buffer tant que place
     
        //if(buffer[sizeIn-1]==';') break;  // on sort si dernier caractere recu=;
        if (c==';') break; // equivalent car c est le dernier caractere recu - 
        // on analyse après...
     
        if (Serial.available()==0) delay(5); // laisse temps éventuel nouveau caractere arriver
     
      } // fin while  octet réception
     
      // si arrivee instruction GCode valide
      //if(sizeIn>0 && buffer[sizeIn-1]==';') { // si caractere dans le buffer et dernier est un ;
      if(sizeIn>0 && buffer[sizeIn-1]=='\n') { // si caractere dans le buffer et dernier est un \n
     
        // lorsqu'un message GCode valide a été recu
        buffer[sizeIn]=0;  // ajoute un 0 à la fin du buffer pour traitement en chaine de caractere
     
        //Serial.print(F("\r\n"));  // affiche message
        // if debug : Serial.println(buffer);  // affiche message - traité comme une chaine 
     
        analyseChaine();  // analyse la commande
     
        ready(); // reinitialise buffer
     
      }// fin else
     
      // --- commande personnalisée --- => a mettre dans analyse chaine.. 
      else if (sizeIn>0 && buffer[0]=='$') { // sizeIn>0 et ready() necessaires 
     
        Serial.println("status()");
        status();
        ready(); // reinitialise buffer
     
      } // else if
      else if(sizeIn>0 ) { // sinon on vide le buffer reception
     
         Serial.println(); // saut ligne 
         ready(); // reinitialise buffer
     
      } // fin else if

    Lorsque j'utilise le moniteur série de l'IDE Arduino, ma led s'allume lorsque j'envoie la commande "G00 X10 F5" mais lorsque j'utilise mon programme Qt elle ne s'allume pas. On voit quand meme le RX et TX s'allumer se qui signifie qu'une transmission à lieu.

    J'ai observé qu'avec le moniteur série de l'IDE Arduino, la led ne s'allume que si on met l'option "retour à la ligne". Il y a t'il une initialisation à faire dans mon programme Qt pour avoir un retour à la ligne ?

    Je suis un peu perdu, j'attends vos retour avec impatience .

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Citation Envoyé par alexharistoy Voir le message
    Bonjour,
    J'ai observé qu'avec le moniteur série de l'IDE Arduino, la led ne s'allume que si on met l'option "retour à la ligne". Il y a t'il une initialisation à faire dans mon programme Qt pour avoir un retour à la ligne ?
    Bonjour,

    Il n'y a pas d'option "retour à la ligne", il faut simplement l'ajouter lors de la construction de la trame.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    byte.clear(); // on efface le contenu de byte
    byte.append(trame); // on ajoute "value" a byte
    byte.append("\n"); // <-- retour à la ligne
    Il y a aussi une erreur avec la fonction void FenProjet::envoie(char trame), le paramètre devrait plutôt être un pointeur sur char char * trame ou un QByteArray.
    Actuellement il n'y aura qu'un seul caractère passé à la fonction vu qu'on passe un simple char.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2018
    Messages : 17
    Par défaut
    Super ca fonctionne !
    Oui trame est de type char parce que j'essayé de faire passer qu'un seul caractère au moment où je vous ai envoyé mon code. Pour envoyer une chaine de caractère j'utilise le type-fonction (je sais pas trop ) QString et ca fonctionne. C'est une manière correcte d'écrire ma fonction ?
    Je te remercie pour ton aide.

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Par défaut
    Oui avec QString ça va aussi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage de fichier Java, transmission Windows vers Unix
    Par batou22003 dans le forum Langage
    Réponses: 19
    Dernier message: 07/10/2015, 09h54
  2. Réponses: 0
    Dernier message: 29/09/2014, 19h59
  3. Souci d'envoi caractère vers arduino pyserial
    Par Farmer64 dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 25/11/2013, 11h17
  4. [pyserial] lecture port série sur arduino
    Par blaster68 dans le forum Déploiement/Installation
    Réponses: 1
    Dernier message: 07/03/2013, 09h00
  5. Transmission variable vers formulaire
    Par Mat67 dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 06/02/2008, 13h55

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