IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

[Linux][Arduino UnoR3][1.8.9] Le programme ne fonctionne que lorsque le serial monitor est activé


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut [Linux][Arduino UnoR3][1.8.9] Le programme ne fonctionne que lorsque le serial monitor est activé
    Bonjour,

    Je viens de terminer les examens avec mes élèves, et il s'est passé un truc que je n'avais pas remarqué chez moi: notre programme ne semble pouvoir communiquer avec l'Arduino que
    lorsque le "Serial Monitor" est activé :{
    C'est une de mes élèves qui me l'a fait remarquer ^^

    Pendant mes tests j'utilisais effectivement le "Serial Monitor" pour "savoir" ce que faisait l'Arduino de son côté...

    Le programme qui communique avec l'Arduino est écrit en C.
    Voici la fonction qui "configure" le port série, je ne suis pas certain des paramètres utilisés, au vu de ce qu'il nous arrive.

    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
    int ConfigureArduino(char *pFichier,speed_t vitesse)
    {
    	int portdesc;				// descripteur de l'Arduino
    	struct termios options;		// caractéristiques d'un terminal
     
    	portdesc=open(pFichier, O_RDWR | O_NOCTTY | O_NONBLOCK);   // Ni la lecture ni l'écriture ne seront bloquantes
    	if(portdesc>0)	
    	{
    		fcntl(portdesc,F_SETFL,0);		// réinitialiser le port série
    		// Il faut que les deux équipements fonctionnent à la même "vitesse"...
     
    		tcgetattr(portdesc, &options);
    		cfsetispeed(&options, vitesse);
    		cfsetospeed(&options, vitesse);
    		options.c_cflag |= (CLOCAL | CREAD);
     
    		tcsetattr(portdesc, TCSANOW, &options);
    	}
    	return portdesc;
    }
    En fouinant dans les extraits de code fonctionnels (et éprouvés ^^) je suis retombé sur ceci que j'avais oublié de communiquer à mes élèves qui solutionnerait le soucis :{ comme quoi écrire sur un forum et rassembler ses mémoires des fois est fort utile ^^
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int RTS_flag;
    RTS_flag = TIOCM_DTR; // l'Arduino utilise le DTR (Date Transmit Ready)
     
    ioctl(portdesc,TIOCMBIS,&RTS_flag);
    Du coup... voilà je pense avoir résolu le soucis ^^
    Oui bin non c'est pas gagné :{ (après 20 minutes d'essais)

    Du coup je suis toujours dans l'expectative: d'où vient le fait que l'Arduino semble ne pas établir de connexion série sauf quand le "Serial Monitor" est ouvert ?

    Voici la partie setup de l'Arduino

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Serial.begin(115200);
      digitalWrite(LED_BUILTIN, LOW);
     
    	while(Serial.available()) Serial.read();			// vider le "buffer"
    	Serial.flush();
    et j'utilise la fonction Serial.readString() dans la fonction loop().

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RTS_flag = TIOCM_DTR; // l'Arduino utilise le DTR (Date Transmit Ready)
    il y a une contradiction entre le commentaire (DTR) et le nom du flag (RTS).

    Essaye en mettant RTS et CTS à true. Je n'ai pas remarqué d'influence du DTR dans la communication avec UNO (et autres cartes qui ont un ATmega328).
    Par contre DTR et DSR doivent être à false pour Léonardo (et autres qui ont un ATmega32u4).

    As-tu bien pensé à mettre également le nom de l'utilisateur dans le groupe dialout ?
    https://www.developpez.net/forums/d1.../#post10312057

  3. #3
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut
    Oui j'ai utilisé un extrait pas super parlant, voici la fonction qui sert à configurer la ligne série

    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
    int ConfigureArduino(char *pFichier,speed_t vitesse)
    {
    	int portdesc;							// descripteur de l'Arduino
    	struct termios options;		// caractéristiques d'un terminal
     
    	portdesc=open(pFichier, O_RDWR | O_NOCTTY | O_SYNC);											
    	if(portdesc>0)	
    	{
    		fcntl(portdesc,F_SETFL,0);		// réinitialiser le port série
    		// Il faut que les deux équipements fonctionnent à la même "vitesse"...
     
    		tcgetattr(portdesc, &options);
    		cfsetispeed(&options, vitesse);
    		cfsetospeed(&options, vitesse);
     
    		options.c_cflag |= (CLOCAL | CREAD);    /* ignore modem controls */
        options.c_cflag &= ~CSIZE;
        options.c_cflag |= CS8;         /* 8-bit characters */
        options.c_cflag &= ~PARENB;     /* no parity bit */
        options.c_cflag &= ~CSTOPB;     /* only need 1 stop bit */
        options.c_cflag &= ~CRTSCTS;    /* no hardware flowcontrol */
     
        /* setup for non-canonical mode */
        options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
        options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
        options.c_oflag &= ~OPOST;
     
        /* fetch bytes as they become available */
        options.c_cc[VMIN] = 1;
        options.c_cc[VTIME] = 1;
     
    		tcsetattr(portdesc, TCSANOW, &options);
     
    		// extrait de daemonbt.c (driver arduino pour le projet blindtest)
     
    		int Terminal_flag;
    		//Terminal_flag |= (TIOCM_DTR | TIOCM_RTS);
    		Terminal_flag &= ~(TIOCM_DTR | TIOCM_RTS);
     
    		ioctl(portdesc,TIOCMBIS,&Terminal_flag);
     
    	}
    	return portdesc;
    }
    J'observe, quand le "Serial Monitor" n'est pas utilisé, que l'Arduino semble faire un RESET lorsque je configure la connexion série.
    La led RX s'allume brièvement, mais la led TX reste allumée.

    Quand le "Serial Monitor" est ouvert, il n'y a pas de RESET et la led tx clignotte toutes les secondes (j'utilise Serial.println pour afficher un message toutes les secondes);
    la led rx s'allume le temps que le message soit traité par Serial.readString().

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonsoir,



    l'Arduino semble faire un RESET lorsque je configure la connexion série.
    La led RX s'allume brièvement, mais la led TX reste allumée.
    Pour moi c'est bon signe. Après l'ouverture du port série, ajoute une pause (2 à 5 secondes) le temps de l'initialisation de la carte avant de commencer à lire ou à écrire sur le port série.

  5. #5
    Membre expérimenté

    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2012
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2012
    Messages : 330
    Par défaut
    Bonjour Auteur,

    Je n'aurais jamais pensé à mettre deux secondes, j'avais mis une... ça marchait pas :{ là je viens de faire un sleep(2) et ça marche !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Programme ne fonctionne que avec point d'arret
    Par Abyssin dans le forum C#
    Réponses: 3
    Dernier message: 17/01/2013, 15h58
  2. Réponses: 5
    Dernier message: 13/04/2009, 23h12
  3. [Linux] Afficher un shell au démarrage du programme
    Par Maniack Crudelis dans le forum C
    Réponses: 54
    Dernier message: 13/12/2008, 08h26
  4. Mon programme ne fonctionne plus après mise à jour de linux
    Par dybmans dans le forum GTK+ avec C & C++
    Réponses: 22
    Dernier message: 06/05/2007, 18h08
  5. Programme ne fonctionnant que sur certaines machines
    Par Marekh dans le forum DirectX
    Réponses: 14
    Dernier message: 30/08/2005, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo