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

Raspberry Pi Discussion :

Envoyer des données série en Python


Sujet :

Raspberry Pi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    résaeux de capteurs sans fil
    Inscrit en
    Mars 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : résaeux de capteurs sans fil
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2013
    Messages : 1
    Par défaut Envoyer des données série en Python
    Il s'agit de mon code Python qui envoie des valeurs à partir d'un Raspberry Pi3 via un port série (USB).
    J'ai besoin d'envoyer chaque fois d'envoyer une données parmi les trois selon un scénario bien défini. J'ai essayé, mais ça ne marche pas.
    le problème que j'ai eu, le port série toujours envoi data-a quelle que soit la condition
    Quelqu'un peut-il me dire si c'est la bonne façon de procéder?

    Code python : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import os
    import serial
    class Gen:
      def __init__(self, data_a = b'', data_b = b'', data_c =b''):
        self.data_a  = data_a 
        self.data_b  = data_b 
        self.data_c  = data_c  
        self.ser = ser = "/dev/ttyACM0"
      def processus_a(self):
        self.data_a = os.urandom(2)
        self.send()
     
      def processus_b(self):
         self.data_b = os.urandom(3)
         self.send()
     
      def processus_c(self):
         self.data_c = os.urandom(1)
         self.send()
     
     
      def send(self):
        print("Envoi donnees")
        print(":".join("{:02x}".format(c) for c in self.data_c))
        print(":".join("{:02x}".format(c) for c in self.data_a))
        print(":".join("{:02x}".format(c) for c in self.data_b))
     
        try:
          self.ser = serial.Serial( "/dev/ttyACM0", baudrate=115200, timeout= 32)
          self.ser.isOpen()
          print ("port is opened!")
        except IOError:
          self.ser.close()
          self.ser.open()
          print ("port was already open, was closed and opened again!")
        while True:
            if len(self.data_a) >= len(self.data_b):
              self.ser.write(self.data_a)
              print (self.ser.readline())
            elif len (self.data_b) != 0:
              self.ser.write(self.data_b)
            else:
              self.ser.write(self.data_c)
              self.f = open('myfile.txt','wb')
              self.f.write(self.ser.readline())
     
    def main():
      R = Gen()
      R.processus_a()
      R.processus_b()
      R.processus_c()
      R.send()
    if __name__ == '__main__':
           main()

  2. #2
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Citation Envoyé par fekher15 Voir le message
    le problème que j'ai eu, le port série toujours envoi data-a quelle que soit la condition

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if len(self.data_a) >= len(self.data_b) or data_b[1]==b'\x00':
              self.ser.write(self.data_a)
              print (self.ser.readline())
            elif len (self.data_b) != 0:
              self.ser.write(self.data_b)
            else:
              self.ser.write(self.data_c)
              self.f = open('myfile.txt','wb')
              self.f.write(self.ser.readline())
    Tout d'abord je ne suis pas et de loin un expert en Python.
    Il m'est arrivé d'avoir ce genre de soucis avec de telles constructions en C, C++, Java ou autres.

    Dès qu'on a des tests multiples, il faut vraiment faire gaffe, découper mieux son code et les tests de conditions.
    On ne sait pas ce que tu veux faire et il faudrait documenter ton code.
    Avec
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(self.data_a) >= len(self.data_b) or data_b[1]==b'\x00':
    je mettrais la première partie entre parenthèses et j'utiliserais un débogueur avec différentes valeurs pour vérifier TOUS LES CAS.
    Je pense que je déplacerais la dernière condition ailleurs ou avant!

    En fait, tu me donnes l'impression d'avoir effacé tous les commentaires de ton code qui en a besoin!
    A+

  3. #3
    Rédacteur

    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Novembre 2006
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2006
    Messages : 503
    Par défaut
    Bonjour,
    Je reviens sur ma dernière réponse.
    Je suis retraité actif et j'ai été autrefois responsable dans mon entreprise pour mettre en place les règles et conventions de codage pour les langages C++ et Java.
    J'ai donc un peu cherché et il y a quand même pas mal de sites Web où on peut trouver un peu plus d'information comme:

    Best Practices And Tips For Python Conditional Statements

    Si on regarde le premier morceau de code présenté, le def buy_fruit(nerd, store):, qui va être rapidement critiqué, il est déjà mieux que notre

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    if len(self.data_a) >= len(self.data_b) or data_b[1]==b'\x00':

    Attention: je n'ai plus trouvé le or data_b[1]==b'\x00': lors de cette réponse-ci.
    C'est comme si l'auteur avait corrigé son code dans le message d'origine, entre temps, c'est à dire entre ma première réponse et celle-ci!!

    Si on devait soumettre ce code pour un article de magazine ou un bouquin, ...., c'est vite vu.
    Il faudrait aussi toujours penser que ce code pourrait être distribué et relu par d'autres.
    Même si ce n'est que du code perso, on pourrait le reprendre soi-même dans quelques années, et alors ....

    Il y a en fait un autre aspect avec ce fameux data_b[1] égal à 0, dont on ne sait pas à quoi il sert.
    C'est un aspect qu'on pourrait redéfinir dans le "design" de notre application et de ce protocole d'envoi de données.
    En adaptant le protocole, on pourrait aussi simplifier le codage.
    Je me souviens d'un de mes premiers développements d'échange de données via un port série entre deux machines.
    C'était un casse-tête pas possible, jusqu'au jour où j'ai découvert que je pouvais aussi adapter le logiciel de l'autre côté!

    A+
    Cordialement

Discussions similaires

  1. Envoyer des données sur le port série
    Par jbidou88 dans le forum Flash
    Réponses: 3
    Dernier message: 18/09/2006, 11h33
  2. [javax.comm] Envoyer des données sur le Port série
    Par deuspi dans le forum Applets
    Réponses: 2
    Dernier message: 29/08/2006, 09h40
  3. atteindre un ancre en envoyant des données
    Par adilou1981 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 29/03/2005, 11h59
  4. envoyer des données par l'intermédiaire d'un bouton
    Par mathilde50 dans le forum Access
    Réponses: 26
    Dernier message: 28/10/2004, 16h49
  5. [socket] envoyer des données vers un port com
    Par Slimer dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 20/07/2004, 17h35

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