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:
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:
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:
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 :D.