Bonjour tout le monde.

Je suis encore trop novice pour comprendre ce qui se passe, mais je bloque un peu sur un problème de boucle infinie quand je veux récupérer des datas qui viennent de PySerial.

Comme je ne suis pas très doué, je ne vous donne que le code minimum pour comprendre ce qui se passe.
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
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
 
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
 
# -- IMPORTATION --
 
#import Tkinter as tk
import tkinter as tk
import serial
 
# -- INTERFACE GRAPHIQUE
class iface1(tk.Frame):
    def __init__(self, parent):
        #Variables
        self.parent = parent
        self.serialConnection = 0
        self.locations=['/dev/ttyUSB0', '/dev/ttyUSB1', '/dev/ttyUSB2', '/dev/ttyUSB3', '/dev/ttyS0', '/dev/ttyS1', '/dev/ttyS2', '/dev/ttyS3']
        self.ser = ''
        self.currentInterface = 0
 
        #Les frames
        tk.Frame.__init__(self, self.parent)
        self.interfaceDirect = tk.LabelFrame(self, text="Direction standard", padx = 20, pady = 20)
        self.interfaceInfos = tk.LabelFrame(self, text="Informations", padx = 20, pady = 20)
        self.interfaceConnexion = tk.LabelFrame(self, text="Connection", padx = 20, pady = 20)
 
        #Images
        self.myImgAV = tk.PhotoImage(file="ressources/icones/av.gif")
        self.myImgRG = tk.PhotoImage(file="ressources/icones/rg.gif")
        self.myImgRC = tk.PhotoImage(file="ressources/icones/rc.gif")
        self.myImgRD = tk.PhotoImage(file="ressources/icones/rd.gif")
        self.myImgRDG = tk.PhotoImage(file="ressources/icones/rdg.gif")
        self.myImgRDD = tk.PhotoImage(file="ressources/icones/rdd.gif")
        self.myImgAR = tk.PhotoImage(file="ressources/icones/ar.gif")
        self.myImgRT = tk.PhotoImage(file="ressources/icones/rt.gif")
        self.myImgRTG = tk.PhotoImage(file="ressources/icones/rtg.gif")
        self.myImgRTD = tk.PhotoImage(file="ressources/icones/rtd.gif")
        self.myImgTSPG = tk.PhotoImage(file="ressources/icones/tspg.gif")
        self.myImgRSP = tk.PhotoImage(file="ressources/icones/rsp.gif")
        self.myImgTSPD = tk.PhotoImage(file="ressources/icones/tspd.gif")
        self.myImgCO = tk.PhotoImage(file="ressources/icones/co.gif")
        self.myImgCMD = tk.PhotoImage(file="ressources/icones/cmd.gif")
        self.myImgSD = tk.PhotoImage(file="ressources/icones/send.gif")
 
        #Boutons
        self.btAV = tk.Button(self.interfaceDirect, image=self.myImgAV, bg = "grey", command=self.av)
        self.btCo = tk.Button(self.interfaceConnexion, image=self.myImgCO, bg = "green", command=self.serialConn)
 
        self.btSendDirect = tk.Button(self.interfaceSaisieDirect, image=self.myImgSD, bg = "green", command=self.send_direct)
 
        #Positionnement des boutons généraux
        self.interfaceDirect.grid(column=0, row=0, sticky='NS')
        self.btAV.grid(column=2, row=0)
 
        #Positionement du log
        self.interfaceInfos.grid(column=0, row=3, sticky='NS')
        self.textInfos.grid(column=0, row=0)
 
        #Positionnement de la partie connection
        self.interfaceConnexion.grid(column=1, row=3, sticky='NS')
        self.btCo.grid(column=0, row=0)
 
    #Calcul du temps donné par rapport à une distance demandé
    #delay(3000) = 1 tour de roue = 18cm parcourus
    #distance (cm) * 3000 / 18 = temps à effectué.
    def distanceRoute(self):
        distanceCommand = self.distance.get() #Mise à jour de la distance
        timeRoute = ((int(distanceCommand) * 3000)/18)
        return timeRoute
 
    #Avant
    def av(self):
        speed = self.scaleSpeed.get() #Mise à jour de la vitesse
        distance = self.distanceRoute() #Récupère le temps demandé par rapport à une distance demandé
        #Si on utilise l'interface 1 
        if self.currentInterface == 1:
            #Si on a la connection lancé
            if self.serialConnection == 1:
                self.serialOrdre("!,1,1," + str(speed) + ",1," + str(speed) + ",1," + str(speed) + ",1," + str(speed) + "," + str(distance) + ",*")
 
    #Ecrire sur le port série l'ordre
    def serialOrdre(self, ordre):
        data = bytearray(ordre, 'ascii')
        self.ser.write(data)
 
        information = "Envoyé -> " + ordre + "...\n"
        self.textInfos.insert(0.0, information)
        #print("Ordre envoyé",ordre)
 
 
    #Active les boutons standard
    def btnStandard(self):
        #Si on a la connection lancé
        if self.serialConnection == 1:
            self.btAV.configure(bg = "green")
            self.btRG.configure(bg = "green")
            self.btRC.configure(bg = "grey")
            self.btRD.configure(bg = "green")
            self.btRDG.configure(bg = "green")
            self.btRDD.configure(bg = "green")
            self.btAR.configure(bg = "green")
            self.btRTG.configure(bg = "green")
            self.btRT.configure(bg = "green")
            self.btRTD.configure(bg = "green")
            self.currentManDir.configure(bg = "green")
            self.btTSPG.configure(bg = "red")
            self.btRSP.configure(bg = "blue")
            self.btTSPD.configure(bg = "red")
            #Pour se rappeler dans quelle interface on est
            self.currentInterface = 1
 
    #Active les boutons spéciaux
    def btnSpeciaux(self):
        #Si on a la connection lancé
        if self.serialConnection == 1:
            self.btAV.configure(bg = "red")
            self.btRG.configure(bg = "green")
            self.btRC.configure(bg = "blue")
            self.btRD.configure(bg = "green")
            self.btRDG.configure(bg = "green")
            self.btRDD.configure(bg = "green")
            self.btAR.configure(bg = "red")
            self.btRTG.configure(bg = "red")
            self.btRT.configure(bg = "blue")
            self.btRTD.configure(bg = "red")
            self.currentManDir.configure(bg = "red")
            self.btTSPG.configure(bg = "green")
            self.btRSP.configure(bg = "grey")
            self.btTSPD.configure(bg = "green")
            #Pour se rappeler dans quelle interface on est
            self.currentInterface = 2
 
    #Etablir une connexion
    def serialConn(self):
        #Tentative de connexion au XBee Usb
        for device in self.locations:
            try:
                information = "Tentative de connecion sur le port" + device + "...\n"
                self.textInfos.insert(0.0, information)
 
                self.ser = serial.Serial(device, 9600)
                self.serialConnection = 1
                break
            except:
                information = "Connection échoué sur " + device + "!\n"
                self.textInfos.insert(0.0, information)
 
        #Si la connexion est assuré
        if self.serialConnection == 1:
            self.initRover()    #Lancer l'initialisation du rover
 
posl_app = tk.Tk()              #Instancie la classe
 
iface_graphique = iface1(posl_app)
iface_graphique.grid(column = 0, row = 0, sticky='NS')
 
posl_app.title('POSL Rover')    #Titre de l'application
posl_app.mainloop()             #Boucler
Normal que dans ce code on retrouve des choses qui ne vont pas ou qui manque ! C'est voulu pour le moment. De mon côté, je vous ai évité de lire 400 lignes inutiles.

Je cherche donc à implémenter une fonction qui ira régulièrement voir si des datas sont disponibles et les affichera dans la fenêtre de log. Tout ça sans avoir un while(1) car pas propre et bloquant.

Merci pour votre aide.