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 et analyser les données d'un port série


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2015
    Messages : 12
    Par défaut Lire et analyser les données d'un port série
    Bonjour,
    (Je débute en Python)
    Je reçois des données sur un port série à une fréquence de 2 Hz et je souhaiterais une boucle qui toutes les 10 minutes fait une moyenne sur les données


    Le début de 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
    import time
    import serial
    import numpy as np
     
    ser = serial.Serial('COM3', 9600, timeout=1)
     
    fe=2
    mesure=fe*10*60 # nombre de donnees par cycle
    vector=[]
    b=True
     
    while b:
        data=ser.readline()
        moy=np.mean(data)
        print(moy)
    J'essaye de mettre les données reçues toutes les 10 minutes dans un vecteur pour ensuite faire une moyenne, mais je ne vois pas comment faire ..

    Merci pour votre aide

  2. #2
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par jean-pierre123 Voir le message
    Bonjour,
    J'essaye de mettre les données reçues toutes les 10 minutes dans un vecteur
    Merci pour votre aide
    Salut,

    Pour mettre les valeurs dans un vecteur (ou liste) il faut regarder du coté des listes justement.

    La méthode append pourra t'aider à ajouter les valeurs sur lesquels tu souhaites faire une moyenne.

  3. #3
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2015
    Messages : 12
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Salut,

    Pour mettre les valeurs dans un vecteur (ou liste) il faut regarder du coté des listes justement.

    La méthode append pourra t'aider à ajouter les valeurs sur lesquels tu souhaites faire une moyenne.
    Merci, j'ai utilisé la méthode list.append pour mettre mes données dans un vecteur.
    Pour faire la moyenne sur mes données je voudrais récupérer la date et le temps sur mes mesures pour ensuite calculer un delta et lorsque ce delta est égale a 10 minutes, on fait la moyenne.

    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
    import time
    import datetime
    import serial
    import numpy as np
     
    ser = serial.Serial('COM3', 9600, timeout=1)
     
    fe=2
    mesure=fe*10*60 # nombre de donnees par cycle
    time=datetime.datetime.now()
    interval=datetime.timedelta(seconds=600)
    list=[]
    b=True
     
    while b:
        data=ser.readline()
        list.append(data)
        print(list,time)
    Je n'arrive pas a associer la date et le temps (de l'ordinateur) a mes données. Lorsque j'exécute ce code je reçois des données toutes les secondes mais le temps affiché ne change pas

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    C'est un peu logique non, tu définis ton time hors de ta boucle, et attention tu écrases le module time en faisant time=truc

    Ensuite ce serait plus logique d'écrire dans un fichier pour enregistrer ces valeurs, histoire de pas les perdre.

    Et en ce qui concerne l’exécution de ton script toutes les x minutes, faut se pencher du côté des threads amha, et même plus simple si t'es sur linux, créer une tâche planifiée avec crontab, sur windows, je sais pas si y'a un équivalent.

  5. #5
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par jean-pierre123 Voir le message
    Merci, j'ai utilisé la méthode list.append pour mettre mes données dans un vecteur.
    Pour faire la moyenne sur mes données je voudrais récupérer la date et le temps sur mes mesures pour ensuite calculer un delta et lorsque ce delta est égale a 10 minutes, on fait la moyenne.

    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
    import time
    import datetime
    import serial
    import numpy as np
     
    ser = serial.Serial('COM3', 9600, timeout=1)
     
    fe=2
    mesure=fe*10*60 # nombre de donnees par cycle
    time=datetime.datetime.now()
    interval=datetime.timedelta(seconds=600)
    list=[]
    b=True
     
    while b:
        data=ser.readline()
        list.append(data)
        print(list,time)
    Je n'arrive pas a associer la date et le temps (de l'ordinateur) a mes données. Lorsque j'exécute ce code je reçois des données toutes les secondes mais le temps affiché ne change pas
    Salut,

    Alors c'est normal étant donné que ta variable time est définie en dehors de while, du coup time est fixe et ne change pas.

    Pour que tu puisses calculer ton delta sur le temps il te faut définir une variable temps initiale qui sera en dehors de ta boucle while (time_init par exemple) et une variable temps à l'intérieur de ta boucle while (time_real par exemple), tu pourra donc faire le delta entre time_init et time_real.

  6. #6
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2015
    Messages : 12
    Par défaut
    Citation Envoyé par nekcorp Voir le message
    Salut,

    Alors c'est normal étant donné que ta variable time est définie en dehors de while, du coup time est fixe et ne change pas.

    Pour que tu puisses calculer ton delta sur le temps il te faut définir une variable temps initiale qui sera en dehors de ta boucle while (time_init par exemple) et une variable temps à l'intérieur de ta boucle while (time_real par exemple), tu pourra donc faire le delta entre time_init et time_real.
    Super Merci ! j'ai réussi a associer le temps a mes données ainsi qu'a afficher le delta.

    Je fais un test sur 10 secondes, mais je n'arrive pas a sortir de ma boucle pour faire la moyenne
    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
    time_init=datetime.datetime.now()
    test = datetime.timedelta(seconds=10)
    while True:
        data=ser.readline()
        data=data.decode('ascii')
        time_data=datetime.datetime.now()
        delta=time_data - time_init
        list.append(data)
        print(list,delta)
     
        if delta == test:
            moy=np.mean(list)
            print(moy)
            with open('moyenne.csv','a') as f:
                f.write(moy)
                f.close

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Je fais un test sur 10 secondes, mais je n'arrive pas a sortir de ma boucle pour faire la moyenne
    En fait vous êtes toujours dans votre boucle, ce qui ne va pas c'est que votre condition if n'est jamais vérifiée :

    Je ne suis pas super familier avec le module time et datetime mais je pense qu'il y a un soucis entre delta et test

    j'ai fais des tests et j'ai remarqué que les deux ont un format de sortie différent :

    >>> test = datetime.timedelta(seconds=10)
    >>> test
    datetime.timedelta(0, 10)

    >>> time_init=datetime.datetime.now()
    >>> time_data=datetime.datetime.now()
    >>> delta=time_data - time_init
    >>> delta
    datetime.timedelta(0, 16, 538000)
    Le soucis doit venir des microseconde, si la condition est faite à 10sec + un delta alors la condition ne sera jamais vérifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    >>> test = datetime.timedelta(seconds=10)
    >>> test
    datetime.timedelta(0, 10)
     
    >>> test1 = datetime.timedelta(seconds=10, microseconds=10)
    datetime.timedelta(0, 10, 10)
     
    >>> test1==test
    False
    Du coup il faut revoir la condition et l'écriture du delta.

Discussions similaires

  1. [Débutant] Enregistrer les données d'un port série
    Par jean-pierre123 dans le forum C#
    Réponses: 2
    Dernier message: 02/05/2017, 18h07
  2. Réponses: 0
    Dernier message: 13/06/2016, 21h36
  3. Réponses: 5
    Dernier message: 03/10/2013, 14h02
  4. Lire les données sur un port //
    Par gastoncs dans le forum Périphériques
    Réponses: 1
    Dernier message: 20/08/2008, 22h40
  5. lire les données sur un port RS232
    Par xave dans le forum Langage
    Réponses: 6
    Dernier message: 06/10/2005, 16h40

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