Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    janvier 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 9
    Points : 0
    Points
    0

    Par défaut Boucle Tkinter et polling série

    Bonjour,

    Ce programme (qui m'a déjà été bien débuggé ici même, merci encore) tourne bien jusqu'à mon idée de faire du polling sur le port série de mon Raspberry Pi (ttyAMA0).

    J'ai testé le port série, et il fonctionne.

    C'est pour la boucle de Tkinter que quelque chose m'échappe.

    Si je comprends bien cette boucle là, tout est en permanence relu entre:
    app = tk.Tk() et cette dernière ligne tk.mainloop() et ceci sans fin. C'est bien cela ?

    Alors il m'est venu l'idée d'utiliser "after" pour aller executer une fonction qui scrute le port série en lecture et affiche s'il y a du nouveau, toutes les 500mSec. Après je m'occuperais d'analyser cette lecture, mais c'est autre chose.
    Seulement, je remarque que cela ne fonctionne qu'une seule fois et pas toutes les 500mSec. (J'avais mis un print "je lis" pour voir si je passais dans ma fonction. Cela s'écrit une seule fois)

    Alors c'est sans doute que je n'ai pas compris comment fonctionnait la boucle , ou qu'il manque quelque chose.

    Les évènements que j'attends arrivent de manière innatendue, sans timing précis. Je dois pouvoir ne rien rater, et de plus je vais monter d'autres ports série en plus.

    Merci pour votre éclairage

    Code :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    import time
    import sys
    import serial, glob
    import Tkinter as tk
    from socket import *
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
    ports = glob.glob('/dev/ttyA*') + glob.glob('/dev/ttyU*')
    print "ports trouves:",ports
     
     
    def find_tibbo():
        s = socket(AF_INET, SOCK_DGRAM)     #UDP with DGRAM
        s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
        s.sendto('X', ('<broadcast>', 65535))
        data , addr = s.recvfrom(1024)
        print "RECU: ", data, " depuis:",addr #pour debug
        s.close()
        return addr[0]
     
    def do_find_tibbo():
        '''dans ce cas, on récupère la variable par son nom tk'''
        ip = find_tibbo()
        ip_label.config(text=ip)
     
    def find_mod(IP):
        print "l'IP passee est:",IP
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10001))
        time.sleep(.1)
        s.send("MODE?\n")
        time.sleep(.1)
        mode = s.recv(1024)
        print mode
        s.close()
        return mode
     
    def do_find_mode():
        ''' on récupère la variable par son nom tk '''
        # print IP n'afficherait que la variable globale 0.0.0.0
        # print "the label is", ip_label.cget("text")  ca, ca marche
        mod = find_mod(ip_label.cget("text"))
        mod_label.config(text=mod)
     
    def send_value(value):
        IP = ip_label.cget("text")
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10001))               #port 10001
        time.sleep(.05)
        s.send("ATT 0 "+ value +"\n")
        print "0 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10002))               #port 10002
        time.sleep(.05)
        s.send("ATT 1 "+ value +"\n")
        print "1 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10003))               #port 10003
        time.sleep(.05)
        s.send("ATT 2 "+ value +"\n")
        print "2 fait"
        s = socket(AF_INET, SOCK_STREAM)    #TCP with STREAM
        s.connect((IP,10004))               #port 10004
        time.sleep(.05)
        s.send("ATT 3 "+ value +"\n")
        print "3 fait" + value
        s.close()
     
    def value5():
        send_value("005")
     
    def value10():
        send_value("010")    
     
     
    def sortie():
        app.destroy()
     
    def readserie():
        #print "je lis\n"
        ser =serial.Serial('/dev/ttyAMA0',9600,timeout=1)
        string = ser.read(10)
        if len(string) != 0:
            print (string)    
     
     
    if __name__ == '__main__':          # 
        app = tk.Tk()
     
        app.geometry('400x400+800+300')
        app.title('subrack controler')
     
        tk.Label(text='Search for IP address').place(x=18,y=15)
        ip_label = tk.Label(text=IP)            # l'adresse IP
        ip_label.place(x=250,y=15)
        tk.Button(text = 'Go',command=do_find_tibbo ,fg = "blue").place(x=200,y=10)
     
        tk.Label(text='Search for mode').place(x=18,y=45)
        mod_label = tk.Label(text=MODE)
        mod_label.place(x=250,y=45)
        tk.Button(text= 'Go',command=do_find_mode ,fg = "blue").place(x=200,y=40)
     
        tk.Label(text='send 0.5dB').place(x=18,y=75)
        tk.Button(text= 'Go',command=value5 ,fg = "red").place(x=200,y=70)
     
        tk.Label(text='send 1.0dB').place(x=18,y=105)
        tk.Button(text= 'Go',command=value10 ,fg = "red").place(x=200,y=100)
     
        tk.Button(text= 'QUIT',command=sortie).place(x=195,y=340)    
     
        app.after(500,readserie)
     
     
        tk.mainloop()

  2. #2
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 712
    Détails du profil
    Informations personnelles :
    Nom : Homme Patrice BLANGARIN
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2006
    Messages : 2 712
    Points : 3 899
    Points
    3 899

    Par défaut

    Bonsoir,
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    import Tkinter as tk
     
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
     
    def readserie():
        app.after(500, readserie)
        print('Lecture')
     
     
    if __name__ == '__main__':          # 
        app = tk.Tk()
        app.geometry('400x400+800+300')
        app.title('subrack controler')
        tk.Label(text='Search for IP address').pack()
        tk.Label(text=IP).pack()
        tk.Button(text='QUIT', command=app.destroy).pack()
        app.after(500, readserie)
        app.mainloop()
    C'est la basse mais n'oubliez pas que c'est l'interpréteur Tcl qui gère cela...

    A noter que je reste plus que septique sur l'utilité du gestionnaire de géométrie place ici.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import Tkinter as tk
     
     
    IP = "0.0.0.0"
    MODE = "Unknow"
     
     
    if __name__ == '__main__':
        app = tk.Tk()
        app.title('subrack controler')
        tk.Label(app, text='Search for IP address').grid(row=0, column=0, sticky='W', padx=5)
        tk.Button(app, text='Go', fg="blue").grid(row=0, column=1, sticky='EW')
        tk.Label(app, text=IP).grid(row=0, column=2, padx=5)
        tk.Label(app, text='Search for mode').grid(row=1, column=0, sticky='W', padx=5)
        tk.Button(app, text='Go', fg="blue").grid(row=1, column=1, sticky='EW')
        tk.Label(app, text=MODE).grid(row=1, column=2, padx=5)
        tk.Label(app, text='send 0.5dB').grid(row=2, column=0, sticky='W', padx=5)
        tk.Button(app, text= 'Go',fg = "red").grid(row=2, column=1, sticky='EW')
        tk.Label(app, text='send 1.0dB').grid(row=3, column=0, sticky='W', padx=5)
        tk.Button(app, text= 'Go',fg = "red").grid(row=3, column=1, sticky='EW')
        tk.Button(app, text= 'QUIT',command=app.destroy).grid(row=4, column=1, sticky='EW')
        app.mainloop()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Invité de passage
    Inscrit en
    janvier 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : janvier 2005
    Messages : 9
    Points : 0
    Points
    0

    Par défaut

    Super, Patrice. Ca marche.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •