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 :

Buffer Python Bluetooth [Python 2.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 16
    Par défaut Buffer Python Bluetooth
    Bonjour à tous,

    Je cherche à allumer une led en fonction des commandes reçus par bluetooth, le code fonctionne, cependant j'ai quelque erreur quand le buffer est déja plein.
    Voici mon 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
    import io
     
    import serial
    import RPi.GPIO as GPIO
     
     
    PORT = "/dev/rfcomm0"
    BAUDRATE = 9600
    TIMEOUT = 0.1
    ENCODING = "Utf-8"
    LED_PIN = 22
     
    try:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setwarnings(False)
        GPIO.setup(LED_PIN, GPIO.OUT)
        etat = 0
     
        while True :
     
            ser = serial.Serial(PORT, BAUDRATE, timeout=TIMEOUT)
            buffer = io.BufferedReader(ser)
            with io.TextIOWrapper(buffer, encoding=ENCODING) as file:
     
                for line in file:
                    # print(ser.in_waiting)
                    # if ser.in_waiting > 0:
                        if len(line)>0 :
     
                            line = line.strip().lower()
                            print(line)
                            print("line :",line.encode("hex"))
     
                            if line == "on":
                                GPIO.output(LED_PIN, GPIO.HIGH)
                                etat = 1
                            elif line == "off":
                                GPIO.output(LED_PIN, GPIO.LOW)
                                etat = 0
            if etat == 1 : GPIO.output(LED_PIN, GPIO.HIGH)
     
    finally:
        GPIO.cleanup()

    Je veux utiliser la fonction ser_waiting, mais le problème est qu'elle me renvoie toujours 0...

    Si certains ont des suggestions, merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par guillaume1937 Voir le message
    Je cherche à allumer une led en fonction des commandes reçus par bluetooth, le code fonctionne, cependant j'ai quelque erreur quand le buffer est déja plein.
    Elles ressemblent à quoi vos commandes? Car normalement ce devraient être des lignes (terminées par "fin-de-ligne")... et votre seul "buffer" devrait être la ligne lue.

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

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 16
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Elles ressemblent à quoi vos commandes? Car normalement ce devraient être des lignes (terminées par "fin-de-ligne")... et votre seul "buffer" devrait être la ligne lue.

    - W
    Les commandes c'est soit du "on" soit "off", grâce à la commande strip, on ne garde que le mot, mais je ne comprends pas pouquoi la fonction renvoie toujours 0

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par guillaume1937 Voir le message
    Les commandes c'est soit du "on" soit "off", grâce à la commande strip, on ne garde que le mot
    ça ne répond as à ma question qui était de savoir si les commandes se terminaient ou pas par "fin de ligne".

    Citation Envoyé par guillaume1937 Voir le message
    mais je ne comprends pas pouquoi la fonction renvoie toujours 0
    Si la logique est de lire tout ce qui arrive... pourquoi resterait-il des octets à lire?

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

  5. #5
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 16
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    ça ne répond as à ma question qui était de savoir si les commandes se terminaient ou pas par "fin de ligne".



    Si la logique est de lire tout ce qui arrive... pourquoi resterait-il des octets à lire?

    - W
    Oui les commandes se termine par \n, mais là le problème n'est pas dans la condition, puisque j'arrive à allumer la LED, c'est que parfois le programme ne prend pas en compte la commande que j'envoie, et je suppose qu'il y a un problème avec le buffer, et je ne comprends pas pourquoi la fonction waiting renvoie tout le temps 0 alors que ça ne devrait pas être le cas

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par guillaume1937 Voir le message
    je suppose qu'il y a un problème avec le buffer, et je ne comprends pas pourquoi la fonction waiting renvoie tout le temps 0 alors que ça ne devrait pas être le cas
    Si les commandes reçues se terminent par une fin de ligne, il serait plus simple de les récupérer avec serial.readline(...) et de définir un timeout pour ne pas y rester coincé indéfiniment.
    note: "plus simple" <=> un code plus facile à comprendre et à mettre au point.

    La fonction serial.in_waiting retourne 0 lorsqu'il n'y a rien en attente. Ce qui me semble cohérent avec le code qui a été écrit.

    Citation Envoyé par guillaume1937 Voir le message
    c'est que parfois le programme ne prend pas en compte la commande que j'envoie, et je suppose qu'il y a un problème avec le buffer,
    Si vous pensez qu'il y a un problème avec le BufferedReader, virez le, il ne sert à rien.
    Et si le problème est toujours là, vous saurez que ça vient peut être d'ailleurs.

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

  7. #7
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Hello,
    Citation Envoyé par guillaume1937 Voir le message
    Les commandes c'est soit du "on" soit "off", grâce à la commande strip, on ne garde que le mot, mais je ne comprends pas pouquoi la fonction renvoie toujours 0
    Pourrait-on voir une ligne de commande complète ? Si il y a un crlf à la fin, plus la peine de gérer le buffer d'entrée, un readline est suffisant.
    Ami calmant, J.P

  8. #8
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2022
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Mars 2022
    Messages : 16
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    Hello,

    Pourrait-on voir une ligne de commande complète ? Si il y a un crlf à la fin, plus la peine de gérer le buffer d'entrée, un readline est suffisant.
    Ami calmant, J.P
    Qu'entendez vous par crlf ?
    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
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
     
    #!/usr/bin/env python3
     
    import io
    import serial
    import RPi.GPIO as GPIO
    import time
     
     
    PORT = "/dev/rfcomm0"
    BAUDRATE = 9200
    TIMEOUT = 0.5
    ENCODING = "Utf-8"
    LED_PIN = 22
     
    try:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setwarnings(False)
        GPIO.setup(LED_PIN, GPIO.OUT)
        etat = 0
     
        while True :
     
            ser = serial.Serial(PORT, BAUDRATE, timeout=TIMEOUT)
            #print(ser.inWaiting())
            buffer = io.BufferedReader(ser)
            with io.TextIOWrapper(buffer, encoding=ENCODING) as file:
                for line in file:     
                    #if ser.inWaiting()>= 0:
                        line = line.strip().lower()
                        print(line)
                        if len(line)>0 :
                            print("line :",line.encode("hex"))                   
                            if line == "on":
                                GPIO.output(LED_PIN, GPIO.HIGH)
                                etat = 1
                            elif line == "off":
                                GPIO.output(LED_PIN, GPIO.LOW)
                                etat = 0
            if etat == 1 : GPIO.output(LED_PIN, GPIO.HIGH)
     
    finally:
        GPIO.cleanup()
    Et j'ai parfois cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      File "LED_buffer.py", line 30, in <module>
        for line in file:
      File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 545, in readinto
        data = self.read(len(b))
      File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 501, in read
        'device reports readiness to read but returned no data '
    serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
    Oui mais au final j'avais également fait ce programme là et le problème était le même...
    Peut être que ça vient du timeout ? j'ai essayé plusieurs valeurs, mais ça change juste le délais, et disons que je reçoit 8 commandes sur 9...

    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
    #!/usr/bin/env python
    # -*- coding: latin-1 -*-
     
    import serial
    import RPi.GPIO as GPIO
    import time
     
    ser = serial.Serial('/dev/rfcomm0', 9600, timeout = 0.1)
    GPIO.setmode(GPIO.BOARD) #Définit le mode de numérotation (Board)
    GPIO.setwarnings(False) #On désactive les messages d'alerte
    LED = 22
    GPIO.setup(LED, GPIO.OUT) #Active le contrôle du GPIO  
    etat = 0
     
    while True:
     
            msg = (ser.readline().decode('utf-8')).strip().lower()
            #print(msg)
            #if len(msg) > 0 : print(msg)      
            if msg in ['on', 'ON']:
                print("LED on")
                GPIO.output(LED, GPIO.HIGH) #On allume
                etat = 1
            elif msg in ['off', 'OFF']:
                print("LED off")
                GPIO.output(LED, GPIO.LOW)
                etat = 0 
                if msg == "" : msg = 'off'
            elif  (msg == "" and etat ==1) : GPIO.output(LED, GPIO.HIGH)

  9. #9
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 211
    Par défaut
    Citation Envoyé par guillaume1937 Voir le message
    Qu'entendez vous par crlf ?
    crlf = carriage return line feed = retour à la ligne = chr(13) + chr(10)
    Si les trames que tu reçois possèdent ces valeurs à chaque ligne de commande alors le readline est la meilleure option pour lire.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par guillaume1937 Voir le message
    Oui mais au final j'avais également fait ce programme là et le problème était le même...
    Peut être que ça vient du timeout ? j'ai essayé plusieurs valeurs, mais ça change juste le délais, et disons que je reçoit 8 commandes sur 9...
    On ne peut pas reproduire les problèmes que vous rencontrez parce que nous n'avons pas les mêmes équipements pour dialoguer avec le port série.

    Du coup, vous êtes un peu seul pour diagnostiquer ce qu'il se passe... et à pouvoir prendre des initiatives pour conforter vos diagnostics.

    Et comme vous n'avez toujours pas simplifié votre code...

    Bon courage.

    - 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. petit programme python pour recevoir des données en Bluetooth
    Par sergio1958 dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 27/02/2021, 14h31
  2. Réponses: 2
    Dernier message: 20/07/2018, 10h10
  3. [Python 3.X] Nombre d'octets dans le Buffer du Bluetooth série (PyBluez)
    Par Elinux dans le forum Général Python
    Réponses: 1
    Dernier message: 06/07/2018, 11h21
  4. le bluetooth avec Python
    Par PIC83 dans le forum Général Python
    Réponses: 3
    Dernier message: 28/02/2018, 13h59
  5. Réponses: 2
    Dernier message: 19/03/2011, 22h30

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