Как собирать данные только когда я нажимаю кнопку запуска с помощью Tkinter и py Serial? - PullRequest
1 голос
/ 26 июня 2019

У меня есть USB-датчик GPS, и я пытаюсь создать интерфейс человек / машина, в котором пользователь нажимает кнопку «Пуск», и данные начинают собираться.Для этого я помог себе с этим кодом http://robotic -controls.com / learn / python-guis / tkinter-serial .

Мне удалось получить данные и отобразить их на экране только тогда, когда пользователь нажал кнопку «Пуск», но я увидел, что когда я нажимаю кнопку, на экране отображается много предыдущих данных.Мой датчик выдает мне данные каждую секунду, когда я запускаю свою программу, если я жду 5 секунд, прежде чем нажать кнопку пуска, у меня будет 5 строк, отображаемых на экране, когда я нажму на нее.

Вот мойкод:


import serial
import tkinter
from serial import *
from tkinter import *

gps = list()      
serialPort = "COM12"
baudRate = 4800
ser = Serial(serialPort , baudRate, timeout=0, writeTimeout=0)


root = Tk()
root.wm_title("Signal GPS")
etat = StringVar()
etat.set("Démarrer acquisition")

def StartStop():
    j=0
    if etat.get() == "Arreter acquisition" :
        etat.set("Reprendre acquisition")
        j=1

    if (etat.get() == "Démarrer acquisition" or etat.get() == "Reprendre acquisition") and j == 0 :
        etat.set("Arreter acquisition")        
        readSerial()

def quitter():
    root.destroy()


valeurs = Canvas(root)
valeurs.grid(column=0,row=0, padx=10)

texte_lati = Label(valeurs, text='Latitude')
texte_lati.grid(column=0, row=0)
lati = Text ( valeurs, width=20, height=20, takefocus=0)
lati.grid(column=0, row=1)

texte_longi = Label(valeurs, text='Longitude')
texte_longi.grid(column=1, row=0)
longi = Text ( valeurs, width=20, height=20, takefocus=0)
longi.grid(column=1, row=1)


start = Button(root, textvariable=etat, text=etat, command=StartStop)
start.grid(column=0,row=2)

quitte = Button(root, text='Quitter', command=quitter)
quitte.grid(column=1,row=2)


serBuffer = ""
def readSerial():

    while etat.get() == "Arreter acquisition" :                       
        c = ser.read().decode("latin1") 

        if len(c) == 0:
            break

        global serBuffer

        if c == '\r':
            c = '' 

        if c == '\n':
            if serBuffer[0:6] == '$GPGGA' :
                gps.append(serBuffer.split(','))
                serBuffer += "\n"

                if gps[-1][2] == '' :
                    lati.insert('0.0', 'Pas de signal GPS\n')

                else :
                    lati.insert('0.0', str(gps[-1][2]) + '\n')

                if gps[-1][4] == '' : 
                    longi.insert('0.0', 'Pas de signal GPS\n')
                else :
                    longi.insert('0.0', str(gps[-1][4]) + '\n')

            serBuffer = "" 

        else:
            serBuffer += c 

    root.after(100, readSerial) 


root.mainloop()
ser.close()

Может кто-нибудь объяснить мне, почему я получаю все предыдущие данные?Я ожидал, что использование while etat.get() == "Arreter acquisition" : не сохранит данные, но на самом деле ...

...