仅当我使用Tkinter和py Serial单击开始按钮时,如何收集数据?

时间:2019-06-26 14:54:10

标签: python tkinter sensor pyserial

我有一个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" :不会存储数据,但实际上可以存储...

0 个答案:

没有答案