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 :

lecture donnée port série i2c python


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 29
    Par défaut lecture donnée port série i2c python
    Bonjour,

    Je souhaite faire l'acquisition de données provenant du port série (bluetooth com7) avec python 3.

    j'ai fais un petit bout de programme et j'arrive a afficher des données mais elles ne sont visibles puisque encodées, je présume...

    Je vois les données défiler mais j'obtiens des caractères du type (b'\xd3')

    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
    import serial
    import numpy as np
     
    ser= serial.Serial('com7', 115200)
     
     
    if ser.isOpen:
        print("port ouvert")
        while ser.inWaiting()>=0:
            ser.write("e".encode())
            for i in range (10):
                print("envoi",i)
                data=str(ser.read())
                print(data)
     
     
    else :
        print("port fermé")
        ser.open()
    Je souhaiterai pouvoir afficher les octets (en décimal) pour pouvoir reconstruire mon info issue du capteur (suivant le protocole codée sur 2 octets).

    Je vous remercie d'avance pour votre aide!

  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 tournette Voir le message
    Je souhaiterai pouvoir afficher les octets (en décimal) pour pouvoir reconstruire mon info issue du capteur (suivant le protocole codée sur 2 octets).
    b'\xd3' est l'octet d3 en hexadecimal (c'est le \x qui précède d3 qui dit çà).
    Le b'...' vient de ce que cet "octet" est représenté en Python sous forme de bytes.
    Si vous voulez transformer çà en un entier, ord(b'\xd3') retournera 211.

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

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 29
    Par défaut
    Bonjour et merci pour votre réponse cela fonctionne très bien.

    J'en profite pour poser une autre question:

    Maintenant que j'arrive a afficher les octets en décimal je vais pouvoir les traiter. le protocole pour l'information sur d'un capteur est codé sur 12 bits compris dans les deux premier octets renvoyé sur le port série. Je vais donc devoir traiter les octets pour retrouver la valeur du capteur. par exemple pour le premier octet je vais devoir lui ajouter 255 (octet de poids fort). Il faudra aussi que je test la moitié du nombre obtenu pour le signe de la valeur du capteur (le premier bit de l'octet de poids fort donne le signe)...
    D'où ma question :
    comment vaut-il mieux aborder le problème? Faut-il stocker dans un seul tableau toutes les données comme j'ai commencé à le faire dans mon programme
    OU faut-il mieux utiliser des matrices en remplissant chaque ligne par l'ensemble du mot de 10 octets renvoyé

    OU ... d'autres idées?

    Je vous remercie d'avance pour votre réponse.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Novembre 2016
    Messages : 29
    Par défaut
    j'ai oublié voici le code actuel

    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
     
    import serial
    import numpy as np
     
     
    ser= serial.Serial('com7', 115200)
     
    duree=0.1
    t=0
    donnee=[]
     
    if ser.isOpen:
        print("port ouvert")
        while t<duree/0.015:
            try:        
                print("envoi")
                ser.write("e".encode())
                for i in range (10):
                    try:
                        data=(ser.read())
                        data=ord((data))
                        donnee.append(data)
     
                        print((data))
                    except:
                        print("plus de données")
            except:
                print("problème d'envoi")
            t=t+1
    else :
        print("port fermé")
     
    print("port fermé")
    ser.close()
    print(donnee)

  5. #5
    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,

    Ca serait plus simple de demander à Serial de lire 10 bytes (ser.read(10)) et de ne pas oublier de donner un timeout à l'ouverture du port pour éviter d'attendre indéfiniment.

    Un truc comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with serial.Serial('com7', 115200, timeout=0.1) as port:
           port.write(b'e')
           try:
               data = port.read(10)
               return list(bytearray(data))
           except ...
               traiter le timeout
    Essayez de lire la documentation de Serial (et de Python) pour voir comment utiliser au mieux ce qu'il offre déjà plutôt que d'essayer de coder çà par vous même (sauf si vous êtes sur que Serial ne fait pas ce que vous attendez).

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

Discussions similaires

  1. Lecture données port série
    Par lio59 dans le forum VB.NET
    Réponses: 26
    Dernier message: 24/08/2011, 00h37
  2. Pb lecture sur port série sous XP SP2
    Par ViveLesQuads dans le forum Delphi
    Réponses: 7
    Dernier message: 09/06/2006, 17h12
  3. Réponses: 13
    Dernier message: 24/05/2006, 10h27
  4. Recevoir données port série
    Par Vodkha dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/09/2005, 11h45
  5. [C#] lecture sur port série
    Par Iokanaan dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/05/2005, 13h50

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