Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

PYTHON: liaison série



  1. #1
    perchman

    PYTHON: liaison série


    ------

    Bonjour,

    Voilà, avec 2 copains, on a créé une station météo à l'aide d'une carte XEVA et de diverses cartes capteurs.

    Moi, je dois créer une interface PC en langage Python. La carte Xeva est relié au PC par une liaison série. Je l'ai testée entre 2 PC sous python (module pyserial) et elle fonctionne; en voici les 2 "programmes":

    Envoi
    import serial
    ser=serial.Serial(0)
    ser.write("azerty")
    Réception
    import serial
    ser=serial.Serial(0)
    ser.read(6)
    Voilà, maitenant que ça marche entre 2 PC, je dois faire un programme pour recevoir des données de la carte Xeva toutes les 5s. Mais là, je ne vois pas comment faire, si vous pouviez m'aider....

    Merci

    -----

  2. Publicité
  3. #2
    jepoirrier

    Re : PYTHON: liaison série

    Bonjour,

    Est-ce que la fonction sleep du module time te conviendrait ?
    Code:
    import serial
    import time
    buffer = 6 # taille du tampon
    delai = 5 # toutes les 5 secondes
    ser = serial.Serial(0)
    while(true):
         ser.read(buffer)
         time.sleep(delai)
    C'est codé "vite fait" mais avec çà, le programme boucle sans fin et, toutes les 5 secondes (ou le nombre de secondes défini par "delai"), il lit le tampon. Pour la lecture du tampon, cela dépend aussi de la manière dont ta carte envoie les données ...

  4. #3
    perchman

    Re : PYTHON: liaison série

    Je vais tester ce programme la semaine prochaine (j'ai pas le matériel à la maison): ça peut très bien me convenir.

    Merci

    PS: c'est quoiun tampon ??

  5. #4
    perchman

    Re : PYTHON: liaison série

    de plus, je vais devoir enregistrer ces données pour pouvoir réaliser des graphes. Au niveau des graphes, je pense savoir, mais pour enregistrer et aller chercher les données, je nage...

    Si vous pouviez me donner des pistes ou débuts de programme.

    Merci

  6. A voir en vidéo sur Futura
  7. #5
    overmind

    Re : PYTHON: liaison série

    Un tampon c'est un buffer.
    Et si buffer te parait étranger aussi, u peux voir ça comme une zone de mémoire dispo, sous forme de tableau. En python on utilise des stringIO ou tout simplement des chaines...

    Pour enregistrer les données, j'espère que open te dit quelque chose...
    Pour les graphes, le plus simple sera de passer par pylab (matplotlib).

  8. #6
    perchman

    Re : PYTHON: liaison série

    Pour enregistrer les données, j'espère que open te dit quelque chose...
    J'ai trouvé (dans Apprendre à programmer avec Python de G. Swinnen) la manière d'écriture et de lecture séquentielle dans un fichier. Je pense que c'est de celà dont il est question


    ex:
    obFichier=open('Monfichier','a ')
    obFichier.write('Bonjour, overmind !')
    obFichier.close()

    ofi=open('Monfichier','r')
    t=ofi.read()
    print t
    ofi.close()

    Pour les graphes, le plus simple sera de passer par pylab (matplotlib).
    Je ne connaissais pas... Je vais télécharger le module !
    Par contre si vous aviez quelques exemples, ce serait parfait.


    Merci encore

  9. Publicité
  10. #7
    overmind

    Re : PYTHON: liaison série

    Citation Envoyé par perchman Voir le message
    Je pense que c'est de celà dont il est question
    U got it!

    Pour pylab, c'est très bien documenté et le site regorge d'exemples (la FAQ est bien aussi):
    http://matplotlib.sourceforge.net/
    Tu peux également apprendre avec des dir(objet) et des objet.__doc__

  11. #8
    perchman

    Re : PYTHON: liaison série

    Je m'y met ce weekend etje vous tiens au courant...

    J'espère que je n'aurai pas trop de questions à vous poser.

    Bonne soirée

  12. #9
    perchman

    Re : PYTHON: liaison série

    Bonsoir à tous,

    Pour le moment, j'ai écrit ça:

    #------------------Programme de rangement des données--------------------------

    while t==0:

    if e==1:
    obFichier=open('Fichier Température','a')
    obFichier.write('valeur')
    obFichier.close()


    if e==2:
    obFichier=open('Fichier Vitesse','b')
    obFichier.write('valeur')
    obFichier.close()


    if e==3:
    obFichier=open('Fichier Direction','c')
    obFichier.write('valeur')
    obFichier.close()

    Les valeurs 'e' et 't' sont envoyées par la carte Xeva !!

    Est-ce que c'est suffisant pour classer 20 valeurs dans chaque fichier ?

    Et si je veux récupérer une valeur dans un des fichiers (par exemple la 10ème), je ne vois pas ce que je dois écrire

    Merci

  13. #10
    overmind

    Re : PYTHON: liaison série

    Un peu plus prise de "hauteur" serait peut être bienvenue.

    J'essaye de comprendre ce que tu veux faire. Tu as un périphérique, et tu récupère un flux de données. Tu peux par exemple faire un truc du genre:
    Code:
    while 1:
    Buffer = flux.readline() taiter(Buffer)
    NB1:rempacer la méthode readline par ce que tu veux qui convienne , en effet le flux n'est pas forcément pertinament divisé par des '\n'...--> utiliser read(nombredecharàlire) par exemple.
    NB2:sur certains types de flux, un read() met en pause le processus jusqu'à ce qu'il y ait quelque chose de lu, donc faire gaffe à pas mettre de sleep si il n'y a nul besoin.
    NB3@jepoirrier: read ne prend pas de buffer en argument, enfin pas ici...
    NB4: de l'utilisation de open, tu devrais lire le manuel, en particulier pour l'usage du deuxième argument.

    Il te reste à écrire traiter().
    Si j'ai compris la suite, il y a une espèce de pattern qui te permet de déduire le type d'infos reçues. Ensuite tu veux traiter ces informations en fonction de leur type. Pourquoi ne pas transmettre ce raisonnement à la structure de ton code?

    Concrètement, ça signifie séparer le traitement en une phase de reconaissance du type, une phase de formatage, et une phase d'écriture.
    La phase de formatage est importante et te permettra de relire plus facilement les données.

  14. #11
    perchman

    Re : PYTHON: liaison série

    Bon, je vais m'expliquer plus clairement et dire tout ce que je dois faire.

    Voilà, avec 2 copains, on a créé une station météo à l'aide d'une carte XEVA et de diverses cartes capteurs.
    Les capteurs envoient les données (vitesse et direction du vent, et température) à la carte Xeva par bus I²C (pas mon travail). Ces données sont transmises par liaison série au PC. Et moi, je dois afficher ces données sur le PC en créant un logiciel sous Python.

    Conclusion,je dois :
    -afficher en temps réel les 3 données.
    -enregistrer les 3 'types' de données dans 3 fichiers différents.
    -permettre la visualisation des 3 données dans des graphiques.

    Les données envoyées depuis la Xeva arrivent toutes les 5 secondes et dans l'ordre Vitesse, direction puis Température.


    Je pense avoir tout dis !!!! Ah oui, je viens de me mettre au Python tout seul alors, je ne maitrise pas tout, loin de là !!!!


    Voilà!!


    Bonne soirée

    Je me replonge dans Python demain

  15. #12
    jepoirrier

    Re : PYTHON: liaison série

    Bonjour,
    Je pense que tu es sur la bonne voie même si coder un programme "final" en apprenant le langage n'est pas la meilleure solution (mais je le fais aussi donc je ne te jette pas la pierre).

    Si je résume la situation et le code écrit jusqu'à présent, voilà ce à quoi ressemble ton programme (de réception) :
    Code:
    import serial
    import time
    
    buffersize = 6 # taille du tampon
    delai = 5 # toutes les 5 secondes
    ser = serial.Serial(0)
    while(true):
         x = ser.read(buffersize)
         # "rangement" des données
         # Ecrire ici la méthode qui trouve "e" (à partir de x, je suppose)
         # Je suppose qu'on trouve "valeur" aussi ...
         print valeur # affiche la valeur
         # Et stocke cette valeur :
         if e==1:
              obFichier=open('temperature.dat', 'a')
              obFichier.write('valeur')
              obFichier.close()
         if e==2:
              obFichier=open('vitesse.dat', 'a')
              obFichier.write('valeur')
              obFichier.close()
         if e==3:
              obFichier=open('direction.dat','c')
              obFichier.write('valeur')
              obFichier.close()
         time.sleep(delai)
    print "Fini!"
    Je ne sais pas comment tu classes tes données, pour obtenir la comparaison avec "e". Donc, j'ai laissé un commentaire là où il faut déterminer "e".

    J'ai supposé ici que tu écrivais directement les données dans un fichier. Ce n'est pas nécessairement la meilleure façon de faire : on pourrait écrire une fonction (pour simplifier le code de la fonction principale), on pourrait stocker tout dans une variable et reporter l'écriture dans un fichier, etc.

    Personnellement, je réécrirai mes noms de fichiers sans espaces ni accents.

    Pour écrire dans les fichiers, le second argument de la fonction open est ici "a" pour "append" (ajouter). Donc tu ajoutes simplement des données au fichier éventuellement déjà existant (s'ils n'existent pas, il les crée tout seul). Les autres arguments peuvent être 'r' (lecture), 'w' (écriture en recréant le fichier à chaque fois), etc. (voir ici).

    Toujours pour écrire dans les fichiers, tu peux simplifier en écrivant qqch comme ceci :
    Code:
    ser = serial.Serial(0)
    filelist = ['temperature.dat', 'vitesse.dat', 'direction.dat']
    while(true):
         # (voir code ci-dessus)
         # Et stocke cette valeur :
         obFichier=open(filelist[e-1], 'a')
         obFichier.write('valeur')
         obFichier.close()
         time.sleep(delai)
    print "Fini!"
    Finalement, j'ai aussi simplement renommé ma variable "buffer" -> "buffersize", suite à la remarque d'Overmind

  16. Publicité
  17. #13
    perchman

    Re : PYTHON: liaison série

    jepoirrier, je te remercie (overmind aussi)
    => pas de jaloux


    D'abord, j'ai réussi à m'exprimer correctement puisque l'on m'a compris .... et c'est pas évident quand on parle de quelque chose que l'on ne maitrise pas encore

    Ensuite, je pense que le programme dans cet état risque de marcher très rapidement avec la liaison série à la carte Xeva.

    Enfin, vous m'aurez appris beaucoup de choses sur le python que j'aurais trouvé difficilement si j'avais été seul

    Conclusion, ce topic va surement encore servir car mon logiciel est loin d'être terminé

    Bonne fin de weekend.


    Etienne

  18. #14
    perchman

    Re : PYTHON: liaison série

    Salut,

    Appel à mes premiers sauveurs où autres

    Voilà, la liaison entre 2 PCs fonctionnent très bien; avec la carte Xeva, mon camarade a quelques soucis de programmation...=> ça va être résolu...

    Pendant c e temps là, je m'entraine à faire des graphes avec le module Matplotlib!!! J'ai réussi quelques graphes comme tracer un fonction...

    Seulement, moi, je souhaite générer une courbe selon une variable 'i' qui s'incrémente en créant à chaque incrémentation une valeur 's': s=f(i)

    voici le code (qui ne marche pas)!!!

    from random import randrange
    import random
    from pylab import *
    from Tkinter import *

    for i in range(10):
    obFichier=open('temperature',' a')
    s=str(random.randrange(-15,45))
    obFichier.write(s)
    print s
    plot(i,s, 'rs', label='line 1')
    axis([-1, 11, -15, 45])
    legend()
    obFichier.close()
    show()
    Voilà, je bloque (j'ai été sur Matplotlib (ici), et je n'ai pas trouvé)

    Bonne journée

    Etienne
    Dernière modification par perchman ; 05/12/2006 à 12h45. Motif: faute de français

Discussions similaires

  1. Liaison Serie
    Par ibrakanet dans le forum Électronique
    Réponses: 0
    Dernier message: 03/06/2007, 09h53
  2. Liaison série pic18 <> PC
    Par Florentg84 dans le forum Électronique
    Réponses: 2
    Dernier message: 06/03/2007, 23h13
  3. Multiplexeur de liaison serie ...
    Par Seb.26 dans le forum Électronique
    Réponses: 59
    Dernier message: 24/09/2006, 00h48
  4. programmation liaison série labview
    Par rom206 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 31/05/2005, 10h52
  5. liaison série et micro controleur
    Par PELVOUX dans le forum Électronique
    Réponses: 5
    Dernier message: 07/03/2005, 22h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.