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

Python Discussion :

Vérifier si le port série est bien connecté dans un thread [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut Vérifier si le port série est bien connecté dans un thread
    Bonjour à toutes et à tous!
    Je suis en train de faire un petit logiciel qui a besoin du port série pour se connecter à un raspberry pi.
    Et j'ai besoin de checker en permanence (à des intervalles de 0.5 ou de 1s) si le port série est bien ouvert.
    Pour cela, j'ai mon interface graphique en Qt5 et je créer un thread qui est une boucle qui s'arrête lorsque l'ordinateur détecte que la connexion avec le port série est perdue.
    Pour checker si le port est bien ouvert j'utilise la fonction intégrée dans pyserial:
    Sauf que dans mon thread l'état reste toujours à True même si je rompt la connexion...
    Voici mon code (simplifié):
    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
    class MainWindow(QMainWindow):
       def __init__(self, parent=None):
           #  Chargement de l'interface de la fenêtre principale
           QMainWindow.__init__(self, parent)
           self.ui = IDRA_Ui.Ui_MainWindow()
           self.ui.setupUi(self)
           #[...]
           self.port = serial.Serial(str(SelectedPort))  # Connexion
           self.ThreadPortisOpen = PortisOpen(self.port)
           self.ThreadPortisOpen.jobDone.connect(self.colost)
           self.ThreadPortisOpen.start()
    
    
    class PortisOpen(QThread):
        #Signaux
        jobDone = pyqtSignal(bool)
    
        def __init__(self, port):
            QThread.__init__(self)
            self.port = port
    
        def run(self):
            while self.port.isOpen():
                time.sleep(0.5)
                print(self.port.isOpen())
            self.jobDone.emit(True)

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par BlackoOSX Voir le message
    Pour cela, j'ai mon interface graphique en Qt5 et je créer un thread qui est une boucle qui s'arrête lorsque l'ordinateur détecte que la connexion avec le port série est perdue.
    Pour checker si le port est bien ouvert j'utilise la fonction intégrée dans pyserial:
    Vous avez deux sujets là dedans: que veut dire "la connexion avec le port série est perdue"? .isOpen() ou .is_open retournera True tant qu'on n'a pas fait .close() - et qu'on a réussi à ouvrir le port - i.e. si on a volontairement fermé la connexion, la connexion n'est pas perdue, elle est fermée.

    Et si vous pensez que les threads changent quelque chose la dedans, je veux bien qu'on poste des extraits de code mais on ne voit ni l'open, ni le close... et coder un exemple en quelques lignes qui reproduise le soucis ne devrait pas être un problème (et vous permettrait de conforter que le soucis est là ou sinon de chercher ailleurs - dans ce que vous ne montrez pas).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Bonsoir et merci de votre réponse.
    Je pensais que la fonction isOpen() retournait True tant que la connexion avec le périphérique n'as pas été rompue depuis sa connexion...
    Est-ce que vous avez une solution dans ce cas là pour vérifier si le périphérique est toujours branché ?
    Est-ce que il faut faire un test d'envoi de données sur le port série et si cet envoi de données échoue on affiche une erreur qui dit que la connexion a été rompue ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par BlackoOSX Voir le message
    Est-ce que vous avez une solution dans ce cas là pour vérifier si le périphérique est toujours branché ?
    Les possibilités dépendent des signaux et du nombre de fils présents.
    Pour voir à quoi çà ressemble, vous avez l'article Wiki.

    Citation Envoyé par BlackoOSX Voir le message
    Est-ce que il faut faire un test d'envoi de données sur le port série et si cet envoi de données échoue on affiche une erreur qui dit que la connexion a été rompue ?
    Avec 3 fils (le minimum) vous risquez de ne savoir/pouvoir détecter qu'un timeout dans la réception (çà ne répond plus/pas et vous demandez à l'utilisateur de vérifier la connexion, de mettre l'équipement sous tension,...).

    En tous cas, quoique vous fassiez, testez avant de l'intégrer à votre programme!!!

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre chevronné
    Avatar de BlackoOSX
    Homme Profil pro
    Étudiant à l'INSA HdF
    Inscrit en
    Septembre 2014
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant à l'INSA HdF
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2014
    Messages : 360
    Billets dans le blog
    3
    Par défaut
    Merci beaucoup!
    J'ai réglé le problème en faisant un thread qui ne s'occupe que de lire sur le port série et lorsqu'il ne peut plus lire dessus, il envoie une erreur dans un signal.
    Voici le code du thread:
    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
    class PortisOpen(QThread):    #Signaux
    jobDone = pyqtSignal(bool)
    
        def __init__(self, port):
            QThread.__init__(self)
            self.port = port
    
        def run(self):
            while True:
                time.sleep(0.5)
                try:
                    Wating = self.port.read()
                except:
                    self.jobDone.emit(True)
                    break

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Vous avez testé? çà fonctionne?

    Un .read ne sort qu'après avoir reçu un byte (sauf à avoir initialisé le port avec un timeout).
    Et je ne vois pas pourquoi l'engin connecté de l'autre côté expédie un "byte" juste pour vous faire plaisir. Il le fera éventuellement lorsque vous avez expédié une commande qui demande une réponse (et ce .read en attente va bouffer un byte et perturber/corrompre la réception du message).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/02/2016, 14h58
  2. Réponses: 4
    Dernier message: 25/07/2010, 18h36
  3. Comment analyser quel port série est utilisé ?
    Par petitclem dans le forum C
    Réponses: 7
    Dernier message: 29/07/2008, 09h08
  4. MSXML : vérifier si un document XML est bien formé
    Par Patriarch24 dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 19/04/2006, 13h36
  5. [CF][C#]Comment déterminer si mon PPC est bien connecté?
    Par royrremi dans le forum Windows Mobile
    Réponses: 2
    Dernier message: 07/03/2006, 15h35

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