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

Linux Discussion :

Ouverture d'un port série


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut Ouverture d'un port série
    Bonjour à tous,

    Actuellement sur un projet en Linux embarqué, je dois gérer des ports séries. Ayant repris un code déjà existant et qui marche par mes prédécesseurs, j'ai tout de même une question. L'ouverture du port est faite de la manière suivante :

    fd = open(NumCOM.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);

    où NumCOM est un string contenant par ex "/dev/ttyS0".

    Ma question porte en fait sur les droits :

    1) A quoi sert exactement le droit O_NOCTTY ?
    J'ai lu que ça permettait d'empecher une fermeture par exemple avec Ctrl-C ... mais dans le cas de l'embarqué, est-ce vraiment nécessaire ?

    2) Pourquoi se placer en lecture non bloquante ? Ou plus généralement, pourquoi avoir besoin de lecture non bloquante (sachant qu'il n'y a pas de multhreading) ?

    Je vous remercie d'avance pour vos réponses.

    Cordialement,

    Sylvain

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 923
    Points : 220 590
    Points
    220 590
    Billets dans le blog
    128
    Par défaut
    Bonjour,

    Citation Envoyé par syl1405 Voir le message
    2) Pourquoi se placer en lecture non bloquante ? Ou plus généralement, pourquoi avoir besoin de lecture non bloquante (sachant qu'il n'y a pas de multhreading) ?
    Bah, en fait, ( et encore plus dans un système non multi tache ( pas de thread ) ), et bah, les read qui vont être fait sur le périphérique seront bloquant ( si je me rappelle bien ). Bloquant signifie que l'on va attendre de remplir tout le buffer, pour continuer le programme. Mais si un jour, rien n'arrive ... bah vous bloquez toute la machine.

    Pour la première question, je ne sais pas. Ma doc ( le manpage, version anglaise ) m'indique ceci:
    O_NOCTTY
    If pathname refers to a terminal device — see tty(4) — it will
    not become the process’s controlling terminal even if the pro‐
    cess does not have one.
    Soit: déjà ce n'est que pour les terminaux ( tty .. accessible entre autre sur Ctrl+Alt + F1-6 ou /dev/tty ) et cela indique que votre programme ne controllera jamais le terminal ( soit le Ctrl+C ne fermera pas le terminal, mais là c'est une supposition )

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bah, en fait, ( et encore plus dans un système non multi tache ( pas de thread ) ), et bah, les read qui vont être fait sur le périphérique seront bloquant ( si je me rappelle bien ). Bloquant signifie que l'on va attendre de remplir tout le buffer, pour continuer le programme. Mais si un jour, rien n'arrive ... bah vous bloquez toute la machine.
    Merci beaucoup pour cette réponse claire

    Pour la première question, je ne sais pas. Ma doc ( le manpage, version anglaise ) m'indique ceci:

    Soit: déjà ce n'est que pour les terminaux ( tty .. accessible entre autre sur Ctrl+Alt + F1-6 ou /dev/tty ) et cela indique que votre programme ne controllera jamais le terminal ( soit le Ctrl+C ne fermera pas le terminal, mais là c'est une supposition )
    Oui, c'est ce que j'avais lu également, mais sans trouver plus d'explications ... je vais essayer de poursuivre mes recherches de mon coté et je posterais si je trouve d'autres informations.

    Merci encore !

    Sylvain

  4. #4
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Bloquant signifie que tant qu'il n'y a rien, on ne sort pas du read.
    Il faut utiliser select pour surveiller le file descriptor, et associer un timeout, pour ne pas bloquer la machine si rien ne se passe dans le temps imparti.

    Pour la question autour de O_NCTTY, cf les pages de manuel :
    man 2 open :
    ------------
    O_NOCTTY
    If pathname refers to a terminal device — see tty(4) — it will not become the process’s controlling terminal even if the process does not have one.
    Et donc, cf. aussi man 4 tty.

  5. #5
    Membre chevronné

    Homme Profil pro
    .
    Inscrit en
    Janvier 2006
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Janvier 2006
    Messages : 703
    Points : 1 950
    Points
    1 950
    Par défaut
    Pour répondre à ta première question, le ^C peut être utile dans certains cas, notamment si tu veux administrer ta carte ou la paramétrer en série.

    Exemple typique, tu fais un ping pour tester la connexion Internet, pas moyen de killer le processus. Tu es obligé de te connecter en telnet/ssh/... pour aller killer le processus à la main. Tu peux feinter en utilisant un alias genre ping -c2 par exemple.

    Mais tu retrouves le problème assez souvent en phase de dev quoi qu'il en soit. Tu veux lancer un lecteur multimédia et l'arrêter en cours de route avec un ^C, hé bien si tu n'as pas activé la dite commande tu es obligé d'attendre la fin du programme.

    Donc je dirais que ça dépend du contexte et de ton utilisation du port série, et surtout si c'est un port console ou un simple port série. Si c'est un simple port, effectivement si tu utilises ton port pour envoyer des données, le ^C n'est pas forcément utile.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/10/2013, 17h29
  2. Réponses: 3
    Dernier message: 08/02/2010, 11h02
  3. ouverture port série?!
    Par Malek_BAKLOUTI dans le forum Composants
    Réponses: 2
    Dernier message: 04/05/2006, 12h06
  4. problème ouverture de port série
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 26/04/2006, 17h42
  5. ouverture d' un port série
    Par stgi02 dans le forum MFC
    Réponses: 3
    Dernier message: 07/03/2006, 12h31

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