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

C Discussion :

Port série Linux


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 75
    Par défaut Port série Linux
    Bonjour,
    J'ai un petit problème sous linux avec l'utilisation de la fonction select pour gérer un timeout dans la réception de données via un port série.
    En fait je veux pouvoir détecter le fait qu'il n'y a plus de données qui arrivent si t > timeout = 8s par exemple. Mais au lieu de cela, la lecture
    s'arrête au bout de 8 secondes...^^ il y a donc quelque chose que j'ai pas saisi...


    Voilà le pseudo-code :

    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
    47
    48
    49
    50
    51
    52
     
     
    int port_com;
    fd_set read_port_timeout;
    struct timeval timeout;
     
    //Ouverture du port
    	if((port_com = open(nom_COM, O_RDONLY)) < 0){
    		//erreur
    	}
     
    // Gestion des paramètres
    	/*Lecture des parametres courants*/
    	tcgetattr(port_com, &termios_p);
    	/*On ignore les BREAK et les caracteres avec erreurs de parite*/
    	termios_p.c_iflag = IGNBRK | IGNPAR;
    	/*Pas de mode de sortie particulier*/
    	termios_p.c_oflag = 0;
     
     
    // Choix de la parité, Baudrate and co (paramètrage final de type 8N1)
    	/*...*/
     
    	/*Caracteres immediatement disponibles*/
    	termios_p.c_cc[VMIN] = 1;
    	termios_p.c_cc[VTIME] = 0;
    	/*Sauvegarde des nouveaux parametres*/
    	tcsetattr(port_com, TCSANOW, &termios_p);
     
     
     
     
    //Mise en place de timeouts
    	FD_ZERO(&read_port_timeout);
    	FD_SET(port_com, &read_port_timeout);
     
    	timeout.tv_sec = 8;
    	timeout.tv_usec = 0;
     
    // Lecture
    while(port_actif){
    	retval = select(port_com + 1, &read_port_timeout, NULL, NULL, &timeout);
    		if(retval != -1){
    			if(read(port_com,&Buff,1) == -1){
    				port_actif = 0;
    			}
    			else{
    				/*Traitement*/
    			}
    		}
    	}
    }
    Voilà, si qqn avait une idée de l'endroit où je m'emmêle les pinceaux...?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Bonsoir,

    La man page dit ceci :

    Citation Envoyé par man 2 select
    (ii) La fonction select() peut modifier le paramètre timeout pour indiquer le temps restant. La fonction pselect() ne change pas ce paramètre.
    Donc, si select() utilise la même structure pour te renvoyer le temps restant après un déblocage et que tu lui repasses la même structure, alors ton timeout surviendra effectivement huit secondes après le premier appel.

    Le plus propre consiste à réinitialiser les valeurs de ta structure timeval juste avant l'appel à select() pour qu'elles soient remises à huit secondes à chaque tour.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 75
    Par défaut
    J'avais pas du tout fait attention à ça. Je vais donc réinitialiser le timeout juste avant et voir ce que cela me donne. Je pensais que ca venait ou bien de ma gestion du VMIN / VTIME ou du read utilisé en lecture bloquante mais aussi bête que cela puisse être j'aurais jamais trouvé la réinitialisation. D'où l'utilité de potasser le man. Merci beaucoup je reviendrai dire si ca marche ! Bonne soirée

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 75
    Par défaut
    Merci pour votre réponse, cela marche très bien maintenant.

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

Discussions similaires

  1. Communication port série linux
    Par Matrix33 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 25/04/2014, 11h47
  2. Communication sur port série (linux)
    Par Efhache84 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/03/2009, 22h11
  3. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  4. pilote de port série pour le noyau Linux
    Par Nanoucha dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 14/09/2007, 05h04
  5. Port série sous Linux
    Par naoned dans le forum Bibliothèques tierces
    Réponses: 2
    Dernier message: 21/11/2005, 16h45

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