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 .