Проблема: питон все еще читает последовательные данные, поступающие из arduino после закрытия своего порта.Последовательный порт не может быть закрыт - PullRequest
0 голосов
/ 15 сентября 2018

Я новичок в tkinter, использую python 3.4. Я разрабатываю графический интерфейс с использованием окон Toplevel и извлекаю последовательные данные из Arduino. Единственная проблема здесь - всякий раз, когда кнопка «home» нажата из «класса PETwithSC», питон все еще считывает данные в классе StartPage и закрывает графический интерфейс. Мне нужно закрыть последовательный порт после нажатия кнопки домой. Пожалуйста помоги. Спасибо!

Вот код

    from tkinter import *
    import serial
    import time

    class StartPage() 
        def __init__(self,master)
             self.master = master
             self.master attributes('-fullscreen','true') 

             self.button = Button(self.master, command=self.pageOne)
             self.button.pack() 

        def pageOne(self)
             self.master.withdraw()
             self.pick = Toplevel(self.master)
             self.game = PETwithSC(sef.pick)

    class PETwithSC()
        def __init__(self,master)
             self.master = master
             self.master attributes('-fullscreen','true')

             ###### Home button
             self.button = Button(self.master, command=self.home)
             self.button.pack()

             self.data = StringVar()
             self.label = Label(self.master, textvariable = self.data)
             self.label.pack()
             self.master.after(1000,self.serial)

        def serial(self)
             self.ser = serial.Serial("/dev/ttyACM0",9600,timeout=0.1)
             self.ser.write(b'1') ##commanding the arduino to read the smartcard info
             self.info = self.ser.readline()
             self.data.set(self.info)
             self.master.after(1000,self.serial)
             print (A)

        def home(self)
             self.ser.close()
             self.master.withdraw()
             self.pick = Toplevel(self.master)
             self.game = StartPage(sef.pick)

    if __name__ == "__main__":
        app = Tk()
        myGUI = StartPage(app)
        app.mainloop

1 Ответ

0 голосов
/ 16 сентября 2018

Поскольку self.serial() работает в цикле: self.master.after(1000, self.serial), и он открывает последовательный порт каждый раз: self.ser = serial.Serial("/dev/ttyACM0",9600,timeout=0.1), просто закрывая последовательный порт и self.master.withdraw() не остановит следующий 1 прогон self.serial от открытия его снова. Попробуйте просто закрыть порт после каждого использования:

def serial(self)
         self.ser = serial.Serial("/dev/ttyACM0",9600,timeout=0.1)
         self.ser.write(b'1') ##commanding the arduino to read the smartcard info
         self.info = self.ser.readline()
         self.ser.close()                   #closing here
         self.data.set(self.info)
         self.master.after(1000,self.serial)
         print (A)

И удаление его из self.home():

def home(self)
         self.master.withdraw()            #rather than here
         self.pick = Toplevel(self.master)
         self.game = StartPage(sef.pick)

Кроме того, опечатка:

self.game = PETwithSC(sef.pick)

должно быть:

self.game = PETwithSC(self.pick)

Надеюсь, это поможет

...