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 :

Module serial: affichage valeur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Par défaut Module serial: affichage valeur
    Bonjour,

    Dans mon programme exécuté sous python3, je fais l'acquisition d'une masse via une balance. Mais lors de l'affichage de la masse, j'obtient: " b'!KP\r 6.2996 g \r\n' ".

    Comment faire pour uniquement afficher la valeur de la masse? (6.2996g)

    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
     
    se = serial.Serial(
     
                port='/dev/ttyUSB0', 
                baudrate = 9600,
                parity=serial.PARITY_NONE,
                stopbits=serial.STOPBITS_ONE,
                bytesize=serial.EIGHTBITS,
                timeout=1,
                xonxoff=1,
                rtscts=0,
                dsrdtr=0
                )
     
     
            se.write("!KP\r".encode("UTF-8"))
            i=True
            x=""
            while i:
                    if(se.inWaiting()>0):
                        x=se.readline()
                        se.readline()
                        i=False
                        print (x)
                        se.close()
    En vous remerciant.

    Cordialement.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    il suffit de convertir la réponse comme ceci :

    x = se.readline() # bytes
    x = x.decode('utf-8') # str

    NB: Êtes-vous sûr que c'est bien de l'UTF-8 l'encodage du protocole de votre instrument, pas plutôt de l'ASCII ?

    ensuite de séparer les valeurs : sans argument split va séparer les blancs espaces et tabulations et caractères de retour à la ligne CR (\r) et LF (\n).

    cmd, value, unit = x.split() # example: ['!KP', '6.2996', 'g']

    et pour convertir en valeur flottante :

    value = float(value) # example: '6.2996' --> 6.2996

    Vous pouvez ainsi vous assurer que la réponse est bien associée à la commande envoyée précédemment et non pas une réponse conservée dans le buffer.

    d'ailleurs avant d'envoyer une commande vous devriez effacer les 2 buffers I/O juste pour être sûr:
    se.flushOutput() # Clear output buffer to make sure to sent the last command only
    se.flushInput() # Clear input buffer to make sure the answer come from the last command

    Ensuite dans votre code suivant :

    Citation Envoyé par Cerise22 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            i=True
            x=""
            while i:
                    if(se.inWaiting()>0):
                        x=se.readline()
                        se.readline()
                        i=False
                        print (x)
                        se.close()
    Si la commande n'est pas valide et qu'il ne répond pas ou tout simplement que l'instrument est éteint mais que la liaison série existe (cas avec un convertisseur USB/RS-232) alors vous avez avoir une boucle sans fin.

    Vu que vous avez configuré la liaison série avec un timeout de 1 secode la commande suivante va attendre au moins une seconde et dans le cas contraire va lever une exception: serial.SerialException

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try:
        answer = se.readline() # bytes
    except serial.SerialException:
        answer = b'' # bytes
     
    answer = answer.decode('utf-8') # str
     
    if len(answer) > 0:
        cmd, value, unit = answer.split() # example: ['!KP', '6.2996', 'g']
        value = float(value) # example: '6.2996' --> 6.2996
        print(value, unit)

    Bonne continuation,

  3. #3
    Membre confirmé
    Femme Profil pro
    Etudiante
    Inscrit en
    Mai 2016
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Etudiante

    Informations forums :
    Inscription : Mai 2016
    Messages : 87
    Par défaut
    Merci pour votre réponse bien détaillée.

    J'ai modifier mon programme en y ajoutant, le code ci-dessous et cela fonctionne.
    x = se.readline() # bytes
    x = x.decode('utf-8') # str
    Par contre, je ne comprends pas la seconde partie de votre message:
    dans le cas contraire va lever une exception: serial.SerialException
    Pourriez vous m'expliquer svp cette partie.

    En vous remerciant.

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    si les exceptions et la gestion d'erreur en général vous est inconnu, je vous invite à lire ces cours à ce sujet :

    http://python.developpez.com/cours/a...=page_11#L11-J
    http://python.developpez.com/tutorie...paris7/#LXVIII
    http://deusyss.developpez.com/tutori...en-bref/#LIV-M

    Il y a un très bon article sur la gestion d'erreur sur le site S&M (site de référence pour apprendre python) mais je préfère vous prévenir le site est assez nsfw, il vaut mieux ne pas parcourir le site au travail :
    http://sametmax.com/gestion-des-erreurs-en-python/



    La fonction readline de la librairie serial va essayer de lire le contenu du buffer (tampon mémoire) jusqu'à '\n'.

    Dans le cas où le timeout est à 0 il peut attendre indéfiniment à l'appel de cette fonction et n'en sortira qu'à la réception du caractère new line : '\n' : line feed.

    En mettant une valeur au timeout cela indique que la fonction de lecture ne devra pas attendre plus que le temps configuré et dans le cas contraire retournera une erreur, une exception, dont le type d'exception sera serial.SerialException.

    exemple la fonction va balancer l'erreur de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raise serial.SerialException("Description de l'erreur")
    Il faut donc pouvoir l'attraper pour éviter qu'il ne plante l'exécution de tout le code :

    faites un essai sans envoyer de commande :

    devrait retourner :

    Traceback (most recent call last):...
    ...
    ... SerialException



    Et ceci ne devrait pas lever d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    try:
        se.readline()
    except serial.SerialException:
        pass # ne rien faire

Discussions similaires

  1. [Tableaux] Affichage valeur d'un tableau trié
    Par kcizth dans le forum Langage
    Réponses: 1
    Dernier message: 05/01/2006, 15h47
  2. Affichage valeur de la variable lors du debug
    Par thanae dans le forum Access
    Réponses: 1
    Dernier message: 03/12/2005, 16h05
  3. Requete affichage valeurs diferentes d'un champs
    Par joxbl dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/11/2005, 15h27
  4. []probleme affichage valeur dans combobox
    Par gup dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/09/2005, 09h22
  5. affichage valeur d'un Slider
    Par djiwalloo dans le forum MFC
    Réponses: 4
    Dernier message: 24/11/2004, 10h28

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