我创建了一个python界面,以便在通过串行端口收集数据时在屏幕上显示一些信息。通信是通过ATmega微控制器进行的。按下“开始”按钮后,串行端口应发送数据,然后它将命令字符发送至微控制器('g'
= go)。如果我按下 Close 按钮,则应该停止发送数据( Close 按钮将发送另一个命令字符,'s'
=停止)。
我知道使用tkinter时无法在程序内创建另一个循环(可能导致崩溃和故障)。解决方案是创建线程。因此,我创建了一个Thread
来并行读取tkinter循环中的数据。发送的每个数据块都以'\n'
结尾,因此我不得不使用readline()
命令。
这是简化代码
from tkinter import *
from tkinter import ttk
import time
import serial
import threading
ser = serial.Serial(
port = 'COM3',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=None,
bytesize= serial.EIGHTBITS)
ser.flushInput()
if ser.isOpen() == False:
ser.open()
def raise_frame(frame):
frame.tkraise()
def finish():
ser.write('s'.encode())
time.sleep(1)
ser.close()
root.destroy()
def start():
ser.write('g'.encode())
thread.start()
def readSerial():
while True:
DATA = ser.readline()
print(DATA)
def force_close(event):
ser.write('s'.encode())
time.sleep(1)
ser.close()
root.destroy()
root = Tk()
root.attributes("-fullscreen", True)
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
f1 = Frame(root)
f1.place(x=0,y=0, relheight=1, relwidth=1)
# =============================================================================
# Start Button
# =============================================================================
btn_start=Button(f1, text="Start",font = ("Arial Bold",30), command = start)
btn_start.pack(padx=10,pady=30, side = BOTTOM)
# =============================================================================
# Close Button
# =============================================================================
close_value=BooleanVar()
btn_close=Button(f1, text="Close",font = ("Arial Bold",30), command=finish)
btn_close.pack(padx=10,pady=30, side = BOTTOM)
thread=threading.Thread(target=readSerial)
thread.daemon=True
root.bind('<Escape>',force_close)
raise_frame(f1)
root.mainloop()
问题是:每次我关闭应用程序时都会出现此错误:
Exception in thread Thread-8:
Traceback (most recent call last):
File "C:\Users\apoco\Anaconda3\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "C:\Users\apoco\Anaconda3\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-2-838b466f09c9>", line 41, in readSerial
DATA = ser.readline()
File "C:\Users\apoco\Anaconda3\lib\site-packages\serial\serialwin32.py", line 269, in read
win32.ResetEvent(self._overlapped_read.hEvent)
AttributeError: 'NoneType' object has no attribute 'hEvent'
有人知道如何处理此错误吗?
我在Stackoverflow上进行了搜索,但没有发现任何类似的问题。