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 :

Lire données d'un capteur d'énergie par rs232


Sujet :

Python

  1. #1
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Par défaut Lire données d'un capteur d'énergie par rs232
    bonjour,
    J'ai un capteur d'énergie en liaison RS232 avec le port com1 (de9) de mon PC (lubuntu 16). Je souhaiterais lire les données de ce capteur. Son fabricant m'a envoyé cette doc (qu'il juge donc suffisante) mais que je n'arrive pas à adapter à mes besoins pour recevoir les données de mon capteur. Mon niveau dans ce domaine (python-rs232) est très bas. Mon code de base qui n'affiche rien, est :
    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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from pyduino_pcduino import * # importe les fonctions Arduino pour Python
    #ecrire données venant port serie dans fichier
    #import serial >>> Pas utile car d'origine
    #ser = serial.Serial('/dev/ttyACM0',9600)
    ser = serial.Serial('/dev/ttyS0',2400,8,'E',1,2,False,False)
    # Toutes les 2 secondes lecture du port
    print ser
    #serial.setParity('N')
    #ser.write("REQ_UD2")
    #Serial.println("REQ_UD2")
    ser.write('REQ_UD2')
    while True:  #mettre autre condition, un compteur par exemple
        x = ser.readline()          # read one byte
        print "data lu = ", x
        with open("output.txt", "a") as fichier:
            x = ser.readline()          # read one byte
            mycollapsedstring = ' '.join(x.split())
            #print mycollapsedstring.split(':')
            fichier.write(mycollapsedstring)
            print"ecriture ok"
    fichier.close()
    ser.close()
    #--- obligatoire pour lancement du code --
    if __name__=="__main__": # pour rendre le code executable
        setup() # appelle la fonction setup
        while not noLoop: loop() # appelle fonction loop sans fin
    Qu'en pensez-vous. Merci pour vos futures remarques...

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Ceci ne sert à rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if __name__=="__main__": # pour rendre le code executable
        setup() # appelle la fonction setup
        while not noLoop: loop()
    Tout le code a déjà été exécuté avant cela.

    Tu devrais d'ailleurs avoir une erreur avec noLoop qui n'a pas été définit.
    Et d'où sortent setup() et loop() ?

  3. #3
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Par défaut
    Oups! C'est un copier coller trop rapide! En fait un reliquat de la forme "pyduino" pour pcduino, non utilisé dans le code python pour pc....
    Donc ne pas tenir compte de cette séquence dans ma demande initiale.
    Soit le code de base qui n'arrive pas à lire le port série du capteur :
    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
    #!/usr/bin/python# -*- coding: utf-8 -*-
    from pyduino_pcduino import * # importe les fonctions Arduino pour Python
    #ecrire données venant port serie dans fichier
    #import serial >>> Pas utile car d'origine
    #ser = serial.Serial('/dev/ttyACM0',9600)
    ser = serial.Serial('/dev/ttyS0',2400,8,'E',1,2,False,False)
    # Toutes les 2 secondes lecture du port
    print ser
    #serial.setParity('N')
    #ser.write("REQ_UD2")
    #Serial.println("REQ_UD2")
    ser.write('REQ_UD2')
    while True:  #mettre autre condition, un compteur par exemple
        x = ser.readline()          # read one byte
        print "data lu = ", x
        with open("output.txt", "a") as fichier:
            x = ser.readline()          # read one byte
            mycollapsedstring = ' '.join(x.split())
            #print mycollapsedstring.split(':')
            fichier.write(mycollapsedstring)
            print"ecriture ok"
    fichier.close() ser.close()

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

    Relisez la documentation qui vous a été fournie.
    Paragraphe 3.2, REQ_UD2 est le mnémonique d'une commande.
    On vous y indique la séquence d'octets correspondante à expédier 10 7B AA CS 16 (où AA est probablement une adresse et CS un checksum à calculer) et la réponse à attendre.
    Notez que la documentation n'est pas "auto-suffisante" puisqu'elle renvoie pour certains détails à la norme EN13757-3.

    Sans disposer de l'équipement, lire et comprendre la documentation fournie (histoire de vérifier qu'on a bien compris ce qu'on a lu) n'est pas aisé. De plus côté Python, si le module Serial écrit et lit sur le port RS232, pour savoir quoi expédier et décoder les réponses çà serait mieux de trouver un forum d'utilisateurs de cet engin là.

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

  5. #5
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Par défaut
    @W
    Merci pour votre réponse claire et précise qui confirme certains de mes sentiments sur le problème. Ci-dessous, mes retours:
    Relisez la documentation qui vous a été fournie.
    Quoique vous ressentiez, cette doc a été plusieurs fois parcourue. Mais mon inexpérience dans le domaine m'empêche de l'appréhender à sa juste valeur.
    Paragraphe 3.2, REQ_UD2 est le mnémonique d'une commande.
    On vous y indique la séquence d'octets correspondante à expédier 10 7B AA CS 16 (où AA est probablement une adresse et CS un checksum à calculer) et la réponse à attendre.
    J'avais bien vu ce passage mais j'ai du mal à le mettre en pratique!
    1/ $AA : OK mais quelle adresse? $FD comme mentionné au §2.6.1??? ou $FE comme au §6.14.2 (et dans les § précédents)????
    2/ Checksum: OK mais son calcul me laisse perplexe, si je prends encore §6.14.2 qui laisse entendre que CS de $10 $7B $FE est $79???? Admettons! dans ce cas, CS de $10 $7B $FD serait $78
    3/ Dans ces conditions, j'aurais tendance à écrire ser.write("\x10\x7B\xFE\x79\x16") en référence à http://stackoverflow.com/questions/1...al-with-python. Que pensez-vous de cette approche pour envoyer cette chaine d'initialisation? Car il y a bien un retour du genre : "Z€bð1Zybð+Zybð.Z€bð5Z€bð6Z€bð7" que je n'arrive pas pour l'instant à décrypter!!!
    Notez que la documentation n'est pas "auto-suffisante" puisqu'elle renvoie pour certains détails à la norme EN13757-3.
    Certes pour les détails, mais je supposais que pour les généralités d'une communication basique elle pouvait répondre à mes attentes???
    Sans disposer de l'équipement, lire et comprendre la documentation fournie (histoire de vérifier qu'on a bien compris ce qu'on a lu) n'est pas aisé.
    Je m'en doute bien.
    De plus côté Python, si le module Serial écrit et lit sur le port RS232, pour savoir quoi expédier et décoder les réponses çà serait mieux de trouver un forum d'utilisateurs de cet engin là.
    Pas de forum officiel et l'assistance du fabricant est pour le moins fuyant. Pour l'instant, je n'ai pas vraiment trouvé d'alternative.

  6. #6
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Par défaut
    Suite à quelques essais, voici ce que j'obtiens avec ce 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
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #lire données du capteur venant port serie
    # importe les fonctions Arduino pour Python
    from pyduino_pcduino import * 
     
    ser = serial.Serial('/dev/ttyS0',2400,8,'E',1,5,False,False)
    # Toutes les 5 secondes lecture du port
    print "Ma connexion série = ", ser
    #serial.setParity('N')
    #envoyer "REQ_UD2" en hexa
    ser.write('\x10\x7B\xFE\x79\x16')
    #ser.write('\x10\x7B\xFD\x78\x16')
     
    while True:  #mettre autre condition plus tard
        x = ser.readline()
        mycollapsedstring = ' '.join(x.split())
        print "mycollapsedstring =  ", x.encode('hex')
        print "Soit : ", mycollapsedstring.split(':')
        print"ecriture ok"
    ser.close()
    Dans le terminal, il s'affiche :
    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
    Pyduino for pcDuino - v0.4 - by www.mon-club-elec.fr - 2013 
    PCDUINO
    Ma connexion série =  Serial<id=0xb6c80bcc, open=True>(port='/dev/ttyS0', baudrate=2400, bytesize=8, parity='E', stopbits=1, timeout=3, xonxoff=False, rtscts=False, dsrdtr=False)
    mycollapsedstring =   68545468084e727875015124232004287000000c06000000008c1006000000000c13439436018c2013000000008c4013480000008c8040131200000002fd1710003b3bbdebdd3c2bbdebdddd0a
    Soit :  ['hTTh\x08Nrxu\x01Q$# \x04(p\x00\x00 \x06\x00\x00\x00\x00\x8c\x10\x06\x00\x00\x00\x00 \x13C\x946\x01\x8c \x13\x00\x00\x00\x00\x8c@\x13H\x00\x00\x00\x8c\x80@\x13\x12\x00\x00\x00\x02\xfd\x17\x10\x00;;\xbd\xeb\xdd<+\xbd\xeb\xdd\xdd']
    ecriture ok
    mycollapsedstring =   5a93010a
    Soit :  ['Z\x93\x01']
    ecriture ok
    mycollapsedstring =   5e94010a
    Soit :  ['^\x94\x01']
    ecriture ok
    ... (Et après 5 secondes....)
    mycollapsedstring =   6201f07e16
    Soit :  ['b\x01\xf0~\x16']
    ecriture ok
    mycollapsedstring =   (....Plus de retour du capteur : ...)
    Bref, j'ai du mal à comprendre les retours (voire à répondre si nécessaire!) ....
    Me rediriger en fonction de la doc me serait nécessaire...
    Merci de votre compréhension.

  7. #7
    Membre éprouvé Avatar de cmail
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    1 730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 730
    Par défaut
    Je me suis débloqué avec la librairie suivante : pyMeterBus, difficile à trouver car:
    1/ La recherche sur google avec le terme générique "m(-)bus" ne renvoyait pas sur MeterBus peu usité en France.
    2/ Cette librairie n'est pas encore sur pypi.

    Après contact avec son auteur, celui-ci a actualisé sa librairie notamment en fonction de mes besoins, et se prépare à la mettre sur pypi...

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

Discussions similaires

  1. Lire et gérer des données provenant de capteur ZIGBEE
    Par amiralbhar dans le forum Développement
    Réponses: 1
    Dernier message: 14/01/2020, 16h20
  2. Lire et modifier un port com utilisé par un autre programme
    Par KBNOT-PRC600 dans le forum Langage
    Réponses: 5
    Dernier message: 12/02/2006, 17h40
  3. [Excel] Lire données excel
    Par flopad dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 02/11/2005, 17h34
  4. Utiliser le C pour récuperer données d'un capteur
    Par Malek_BAKLOUTI dans le forum C
    Réponses: 12
    Dernier message: 05/10/2005, 10h40

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