Communication Ordi-Arduino

Bonjour, j'ai fait quelques recherches sur des sites et forums relatifs à Arduino, mais je n'ai toujours pas trouvé comment faire pour communiquer avec un PC.
La console d'Arduino (SerialMonitor) fonctionne et on peut lire les données dedans, j'ai aussi fait un test avec Processing qui marche, mais je n'arrive pas avec d'autres libraires à lire ces données.

Dans mon branchement j'ai juste la carte Arduino Uno reliée par USB à l'ordinateur et 2 boutons poussoirs connectés au broches 2 et 3.
(schéma joint avec le post)

Ce que j'aimerais faire c'est pouvoir lire les états de ces boutons envoyés par Serial de l'arduino avec une autre application que je programme.

J'essai de récupérer ces informations avec QextSerialPort pour l'intéger dans une interface Qt, mais la connexion pose toujours problème :

    port = new QextSerialPort("COM17"); // je le mets sur COM17 comme le SerialMonitor
    port->open(QIODevice::WriteOnly);
	
    if(!port->isOpen())
    {
	QMessageBox::critical(this, "Erreur", "Erreur le port COM17 n'est pas connecté"); // ce message s'affiche toujours alors que le SerialMonitor affiche tout correctement
    }

    else
    {
	port->setBaudRate(BAUD9600);
	port->setFlowControl(FLOW_XONXOFF); // là aussi je ne suis pas sûre 
	port->setParity(PAR_MARK); // idem
	port->setDataBits(DATA_8);
	port->setStopBits(STOP_1);

Du coté de l'arduino j'ai ceci :

void setup()
{
  
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  
  
}

void loop()
{

    int boutonA = digitalRead(2);
    int boutonB = digitalRead(3);
    
    Serial.print(boutonA);
	Serial.print(boutonB);
  
}

D'après certains sites j'ai cru comprendre que pour communiquer entre Arduino et PC comme ceci il fallait utiliser les broches Tx et Rx, est-ce bien cela ? Si oui quels branchements faut-il effectuer ? Et que doit-je rajouter dans mon programme ?

Attention : ce que je vais dire n'est peut être pas bon je ne suis pas un spécialiste :slight_smile:
D'après ce que j'ai pu voir sur la communication avec le port série il n'y a pas besoin de communiquer avec rx et tx, il me semble qu'envoyer des valeurs sur le port avec la fonction "serial.println" (pas sur du nom) suffit pour faire ce que tu souhaites.

J'ai remplacer print par println, mais toujours pas moyen de faire comprendre à Qt que quelque chose est branché =(
Merci quand même pour ton aide.
Sinon, sais-tu si le code Qt est bon ?

if(!port->isOpen())
{
QMessageBox::critical(this, "Erreur", "Erreur le port COM17 n'est pas connecté"); // ce message s'affiche toujours alors que le SerialMonitor affiche tout correctement
}

Si j'ai bien interprété ton commentaire dans le code, tu ne peux pas avoir en même temps le serial monitor et un autre flux ouvert sur le même port com.
Si tu regardes le message d'erreur retourné par ton port->open(QIODevice::WriteOnly) il doit te dire que le port n'est pas disponible.

dans ton script arduino, écrit sur le port série UNIQUEMENT quand un des boutons a un changement d 'état Cela te permettra d'éviter en premier l eceuil d'un overflow de ton api.

perso je suis passé par C-Serial, qui fonctionne tres bien et s'intègre très facilement

J'ai testé sans lancer le logiciel Arduino, et j'ai mis le code suivant à la place.

    if(!port->isOpen())
    {
	QMessageBox::critical(this, "Erreur", "Erreur le port COM17 est indisponnible : 
" + port->errorString());
    }

Mais j'ai "Erreur le port COM17 est indisponnible : unknow error", j'en sais toujours pas plus... :disappointed_relieved:

dans ton script arduino, écrit sur le port série UNIQUEMENT quand un des boutons a un changement d 'état Cela te permettra d'éviter en premier l eceuil d'un overflow de ton api.

En fait c'est déjà le cas, mais c'est pour simplifier que j'avais mis ça , sinon merci pour le lien.

Voici le script complet : (les deux boutons sont censés simuler des capteurs, c’est pour compter des entrée et sorties)

bool CptS = false;
bool CptE = false;
bool quitte = false;
int premierActif = 0;
int premierInactif = 0;
bool procedure= false;
int wSortie = 1, wEntree = 2;
int compteur = 0;

void setup()
{
  
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  
}

void loop()
{

    int aCptE = digitalRead(2);
    int aCptS = digitalRead(3);
    
    if (aCptE != 0)
    {
     CptE = true; 
    }
    else
    {
     CptE = false; 
    }
    if (aCptS!= 0)
    {
     CptS = true; 
    }
    else
    {
     CptS = false; 
    }
    
    
        if (!procedure)
        {
            if (CptS && !CptE)
            {
                premierActif = wSortie;
            }
            else if (CptE && !CptS)
            {
                premierActif = wEntree;
            }
            else if (CptS && CptE)
            {
                procedure = true;
                //Serial.print("\nProcedure\n");
            }
        }
        else
        {
            if (CptS && !CptE)
            {
                premierInactif = wEntree;
            }
            else if (!CptS && CptE)
            {
                premierInactif = wSortie;
            }
            else if (!CptS && !CptE)
            {
                if (premierActif == wSortie && premierInactif == wSortie)
                {
                    Entree();
                }
                else if (premierActif == wEntree && premierInactif == wEntree)
                {
                    Sortie();
                }
                else
                {
                    Serial.print("\nAnnulation");
                }
                procedure = false;
            }
        } 

  
}


void Entree()
{
    if (compteur < 150)
    {
        compteur ++;
        Serial.print("\nEntree -> ");
        Serial.print("Compteur = ");
        Serial.print(compteur, DEC);
        Serial.print("\n");
    }
    else
    {
        Serial.print("\nCompteur au maximum ! (150)\n");
    }
}


void Sortie()
{
    if (compteur > 0)
    {
        compteur --;
        Serial.print("\nSortie -> ");
        Serial.print("Compteur = ");
        Serial.print(compteur, DEC);
        Serial.print("\n");
    }
    else
    {
        Serial.print("\nCompteur au minimum ! (0)\n");
    }
}

regardes plutot avec High et Low comme valeurs .

ça marche pas mieux
Je comprends pas c'est quoi qui marche pas :frowning:

un problème de configuration des trames série (7/8bit / parité/ etc...)

Par contre, com17 : es-tu sur du port (ne serait-ce pas USB17 ou /dev/tty17 par exemple) ? Est-ce bien la bonne écriture (Com17 ou com17 au lieu COM17 par exemple)

essayes port 16. ( 17-1)

Ok, merci pour les conseils, je vais tester tous ça. Je marquerai résolu si ça marche :slight_smile:

tu es sous quelle plateforme ?

taddot:
un problème de configuration des trames série (7/8bit / parité/ etc...)

Par contre, com17 : es-tu sur du port (ne serait-ce pas USB17 ou /dev/tty17 par exemple) ? Est-ce bien la bonne écriture (Com17 ou com17 au lieu COM17 par exemple)

En principe ce devrait être le même nom de port que celui qui apparait dans l'IDE arduino

fdufnews:
En principe ce devrait être le même nom de port que celui qui apparait dans l'IDE arduino

Oui, je suis d'accord, mais j'ai déjà été emm**dé avec ce genre de truc en développant des petits soft sous Qt. Donc ça coute rien de vérifier