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 :

Lecture évènement sur Ring Indicator (port série)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut Lecture évènement sur Ring Indicator (port série)
    Bonjour à tous,
    je cherche le moyen de savoir quand un évènement est levé suite au passage d'un courant sur la broche Ring Indicator d'un port série.

    Je suis sous Linux et en fait j'ai un device USB vu par l'OS comme une liaison série. Cet équipement a un bouton, qui est reporté sur le RI de la liaison série. Comment je fais en C pour savoir quand on appuie sur le bouton de l'équipement ? J'ai trouvé des exemples pour lire tout ce qui passe sur le port série (en mode caractères) mais pas comment avoir la valeur d'une broche particulière.

    Merci,

    Laurent

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    Bon je pense avoir trouvé :

    int fd, status, RI;
    ioctl(fd, TIOCMGET, &status);
    RI = status & TIOCM_RNG;

    ou bien :
    ioctl(fd, TIOCMIWAIT, TIOCM_RNG);
    pour savoir si la broche a changé de statut mais je ne vois pas comment l'utiliser ensuite. Je vais pas boucler dessus quand même ...

    En fait mon problème maintenant c'est comment faire pour qu'à tout moment dans mon code si la borne RI passe à 1 un certain code se déclenche. vous feriez ça comment ? Faire un thread à part qui boucle sur la détection ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    Personne n'a d'idée alors

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ptit_boy
    Bon je pense avoir trouvé :

    int fd, status, RI;
    ioctl(fd, TIOCMGET, &status);
    RI = status & TIOCM_RNG;

    ou bien :
    ioctl(fd, TIOCMIWAIT, TIOCM_RNG);
    pour savoir si la broche a changé de statut mais je ne vois pas comment l'utiliser ensuite. Je vais pas boucler dessus quand même ...
    Ben si. Les ioctl(), c'est rustique... Tu fais un polling avec une boucle à 100 ms (usleep()) et ça devrait suffire. Durée à ajuster selon les contraintes de temps de réaction du bouzin.

    A moins que tu puisses connecter un signal() dessus. Va falloir éplucher la doc et continuer sur un forum dédié..

    http://www.developpez.net/forums/forumdisplay.php?f=327
    En fait mon problème maintenant c'est comment faire pour qu'à tout moment dans mon code si la borne RI passe à 1 un certain code se déclenche. vous feriez ça comment ? Faire un thread à part qui boucle sur la détection ?
    Par exemple.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    OK merci.

    Mais j'ai toujours des problèmes de compréhension :
    - mon processus père fait son main et avant la fin de son main, crée un processus fils (fork, tout ça).
    - le fils boucle sur la détection de signal. Si il détecte un signal sur la broche de ma liaison série, il fait quoi ? Il en informe le père comment ? Et comment le père va faire pour attendre la réponse du fils ? Il va bloquer aussi ?

    Désolé si c'est bête comme question, je suis pas doué en C ....

  6. #6
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    OK, tu n'es pas doué en C. Alors prenons un autre langage. Comment le ferais-tu en Java, PHP, C++ ou autres?

    On remarque assez facilement que ce n'est pas un problème de langage mais "de construction logicielle".

    Si tu désires que le père ne bloque pas, il faudra utiliser un technique de polling sur un indicateur commun entre le père et le fils.

    Pseudo-Code pour le père
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FLAG Ring  = 0; // Indicateur commeun entre père et fils
    CreeFils();
     
    While True Do
       FaisQuelqueChose_1();
       If TestFlagRing() Then // L'accès a Ring doit être synchronisé
          TraiteRing(); 
        End If;
       FaisQuelqueChose_2();
    End While;
    Pseudo-code pour le fils
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    While True Do
       TestChangementStatusRing();
        If RingAChange Then
            ModifieFlagRing(); // L'accès a Ring doit être synchronisé
        End If
        HiberneCertainTemps();
    End While
    C'est une possibilité de solution parmi d'autres. Les autres solution sont la
    programmation événementielle ou bien par l'utilisation de signaux (solution proposée par Emmanuel).

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 7
    Par défaut
    OK ça revient à faire boucler mon processus principal, ce que je voulais éviter. Dans ce cas autant ne pas créer de processus fils et faire boucler directement le processus principal sur la détection d'évènement.

    Je ne crois pas qu'il y ait de signal associé à l'évènement que je veux détecter.

    C'est justement des infos sur la programmation évènementielle en C que je souhaitais avoir. Autant en Java je saurais faire, autant en C je ne vois pas.

Discussions similaires

  1. Lecture de donnée à partir de port série
    Par Sonda09 dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/09/2011, 15h38
  2. Réponses: 7
    Dernier message: 18/07/2011, 17h34
  3. Lecture sur le port série
    Par dmk04 dans le forum C++
    Réponses: 4
    Dernier message: 15/04/2006, 23h56
  4. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50
  5. [Kylix] Lecture sur le port série en C++
    Par MD Software dans le forum EDI
    Réponses: 1
    Dernier message: 08/05/2004, 12h52

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