-
Bonjour j'ai écrit un programme qui me permet de lire des données que m'envois ma carte Arduino via le port série, je voulais vous montrer mon code pour que vous me conseillez sur ce qui ne va pas, le code marche, j'arrive à recevoir toutes les données, en fait les données envoyées par la carte Arduino sont les valeurs de trois potentiomètres et l'état de deux boutons poussoirs. Je voulais savoir s'il y'a une meilleure technique pour faire le traitement Merci.
voici mon code:void fenetre_principal::save_donnee() { QByteArray donnees; if(m_port->bytesAvailable()>=9) { while(continu) { qDebug()<<"i m in while\n"; if(m_port->peek(2).toInt()!=-1){ m_port->getChar(nullptr); } else { m_port->getChar(nullptr); m_port->getChar(nullptr); qDebug()<<"debut_trame\n"; while(m_port->peek(2).toInt()!=-2) { qDebug()<<"enter\n"; if(m_port->bytesAvailable()) donnees.push_back(m_port->read(1)); else break; } m_port->getChar(nullptr); m_port->getChar(nullptr); qDebug()<<"fin_trame\n"; //if(!m_port->bytesAvailable()) continu=false; } } continu=true; dispatch(donnees); donnees.clear(); } else return; }
-
Bonjour et bienvenu sur devnet,
Plutôt que d'avoir une boucle presque infinie comme ça, le plus simple serai d'utiliser la nature asynchrone de QSerialPort. A chaque fois que des données arrivent, les cumuler dans un buffer. Ensuite vérifier si le buffer contient une trame, si oui, l'extraire et la traiter et recommencer jusqu'à ce qu'il n'y ait plus de trame disponible.
-
bonjour j'ai réécrit mon programme comme vous me l'avez conseillé, ça marche!
si vous avez d'autres suggestions , proposez les Svp Merciivoid fenetre_principal::save_donnee() { m_buffer.push_back(m_port->readAll()); QByteArray send{0}; while(m_buffer.contains("-1")&&m_buffer.contains("-2")) {int r(0); for (int i(m_buffer.indexOf("-1")+2);i<(m_buffer.indexOf("-2"));i++) { send.push_back(m_buffer[i]); r++; } m_buffer.remove(m_buffer.indexOf("-1"),r+4); dispatch(send); } qDebug()<<"out\n"; }
-
Quel est le type the m_buffer ?