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

Tkinter Python Discussion :

Tkinter et Pyserial


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Tkinter et Pyserial
    Bonjour,

    Je demande l'aide d'une âme charitable.
    Je souhaite faire un espion de trame RS232 sur Tkinter.
    Je précise que je travaille sur une raspberry pi 2 avec debian Wheezy et une interface FTDI RS232/USB assure la communication.
    L'interface fonctionne car j'ai bien mes trames sur jpnevulator.
    Après quelques recherches, je suis tombé sur site qui correspond exactement ce que je voulais avec en plus une fonction de tri dans un buffer.

    http://robotic-controls.com/learn/py...tkinter-serial

    Chacune de mes trames débute par 0x02 et fini par 0x0D. Donc grâce au tri je pourrais avoir une visualisation claire des trames. Mais le soucis est que lorsque j'exécute le script, la fenêtre s'affiche mais je n'ai aucune info sur ma fenêtre.
    Voici le 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
    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
    55
    56
    #!/usr/bin/env python3
    from tkinter import *
    from serial import *
    from tkinter import filedialog
    import subprocess
    import os
    import time
    fenetre = Tk()
    def espion():
            fe=Toplevel(master=fenetre)
          # # fe.attributes('-fullscreen', 1)
            serialPort = "/dev/ttyUSB0"
            baudRate = 9600
            ser = Serial(serialPort, baudRate,bytesize=SEVENBITS, parity=PARITY_EVEN, stopbits=STOPBITS_ONE, timeout=0, writeTimeout=0, xonxoff= False)
            Frame16 = Frame(fe, borderwidth=2, relief=GROOVE)
            Frame16.pack(side=LEFT, fill=Y)
           # make a scrollbar
            scrollbar = Scrollbar(Frame16)
            scrollbar.pack(side=RIGHT, fill=Y)
           # make a text box to put the serial output
            log = Text ( Frame16, width=30, height=30, takefocus=0)
            log.pack()
           #  attach text box to scrollbar
            log.config(yscrollcommand=scrollbar.set)
            scrollbar.config(command=log.yview)
           #make our own buffer
           #useful for parsing commands
           #Serial.readline seems unreliable at times too
            serBuffer = ""
            def readSerial():
                while True:
                    c = ser.read() # attempt to read a character from Serial
            #was anything read?
                    if len(c) == 0:
                        break
            # get the buffer from outside of this function
                    global serBuffer
            # check if character is a delimeter
                    if c == '0D':
                        c = '\r' # don't want returns. chuck it
     
                    if c == '02':
                        serBuffer += "\n" # add the newline to the buffer
                #add the line to the TOP of the log
                        log.insert('0.0', serBuffer)
                        serBuffer = "" # empty the buffer
                    else:
                        serBuffer += c # add to the buffer
                fe.after(10, readSerial) # check serial again soon
    # after initializing serial, an arduino may need a bit of time to reset
            fe.after(100, readSerial)
     
            fe.mainloop()
    bouton= Button (fenetre, text='espion', command=espion, height=10, widht=11)
    bouton.pack(side=BOTTOM)
    fenetre.mainloop()
    J'espère avoir donné assez d'infos pour vous permettre de m'aider.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par cnx592 Voir le message
    Chacune de mes trames débute par 0x02 et fini par 0x0D. Donc grâce au tri je pourrais avoir une visualisation claire des trames. Mais le soucis est que lorsque j'exécute le script, la fenêtre s'affiche mais je n'ai aucune info sur ma fenêtre.
    Si çà n'affiche pas les trames, c'est peut être qu'elles ne sont pas "reçues" ou pas détectées (les conditions détectant début et fin de trame ne sont jamais remplies). A partir de cette hypothèse, si vous dites "Chacune de mes trames débute par 0x02 et fini par 0x0D", on peut suspecter le code correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                    if c == '0D':
                        c = '\r' # don't want returns. chuck it
                    if c == '02':
    '0D' et '02' sont des chaînes de 2 caractères Unicode (car les str sont unicode en Python3).
    Elles ne seront jamais égales au byte retourné par serial.read(): impossible de détecter une trame (et à fortiori de l'afficher).
    Ils faut les écrire ces littéraux sous la forme b'\x02' et b'\x0D'.

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

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup votre réponse.
    En effet, si je ne mettais pas la bonne syntaxe, je ne risquais pas d'afficher grand chose .
    Malheureusement j'ai toujours le même soucis.
    Je pense peut-être rajouter une ligne du type:
    Car il me semble que de base pyserial n'affiche que des caractères ASCII (je ne suis pas sur).
    Quand j’exécute le programme, il me renvoie un message d'erreur:
    in Readserial
    serBuffer +=c
    NameError: global name 'serBuffer' is not defined
    Apparemment serBuffer ne serait pas déclaré.
    Faudrait-il que je mette ma fonction sous la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def readSerial (self):
        serBuffer += c (self)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par cnx592 Voir le message
    En effet, si je ne mettais pas la bonne syntaxe, je ne risquais pas d'afficher grand chose .
    Malheureusement j'ai toujours le même soucis.
    On peut trouver des "bugs" en lisant le programme mais comme on n'a pas accès au matériel, il n'y a que vous qui puissiez tester, débuguer,...
    Le plus simple serait que vous arriviez à faire fonctionner le programme initial sous Python2, puis que vous le modifiez pour qu'il fonctionne sous Python3, et alors ajouter de nouvelles fonctionnalités sera peut être plus simple.

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

Discussions similaires

  1. [Python 3.X] PySerial - Tkinter et boucle infinie
    Par Caxton dans le forum Tkinter
    Réponses: 47
    Dernier message: 14/06/2015, 11h44
  2. Réponses: 1
    Dernier message: 03/01/2011, 15h19
  3. [Tkinter] Binder le bouton de fermeture d'un Tk()
    Par jc_isd dans le forum Tkinter
    Réponses: 2
    Dernier message: 09/02/2005, 16h11
  4. Réponses: 3
    Dernier message: 26/10/2004, 07h31
  5. Réponses: 3
    Dernier message: 16/08/2004, 10h57

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