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

Я новичок в tkinter, использую python 3.4. Я разрабатываю графический интерфейс, используя окна верхнего уровня и извлекая последовательные данные из Arduino. Единственная проблема здесь заключается в том, что всякий раз, когда нажимается кнопка «домой» из «класса PETwithSC», python по-прежнему считывает данные в классе 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

person Dominic Mendoza    schedule 15.09.2018    source источник


Ответы (1)


Поскольку 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)

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

person third_meow    schedule 15.09.2018