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)
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
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!"); } }
Code Arduino :
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 } }
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.
Partager