1、python的多线程有很多库,我们既然使用使用QT来自作界面,那么就直接使用QT自带的QThread。
2、我们查看下Qthread的官方文档,我们要实现一个thread的类,用来操作com口读取数据,我们需要实现一个run的方法用来执行,代码如下:
class Uthread(QThread):
_signal = pyqtSignal(bytes)
def __init__(self, parent=None):
super(Uthread, self).__init__()
def run(self):
pass
我们新建了一个Uthread的类,定义了一个run方法,并且定义了信号_signal用于传递bytes数据。
上一节课中的串口接收数据的方法:sdata=()
我们在Uthread中添加两个函数:
def initcom(self,com):
def SetAlive(self,alive):
分别用来初始化线程中的串口,以及设置读取状态,更改run代码为:
def run(self):
while :
try:
sdata=()
(sdata)
except Exception as e:
print(e)
break
到此为止,我们多线程的代码已经完成了,就等着我们将线程使用到界面中,我们在Uartwindow中添加代码:
在initdata增加变量: = None
新建两个函数:
#开始串口接收线程
def StartThread(self):
# 创建线程
= Uthread()
.initcom)
.SetAlive(True)
._signal.connect)
# 开始线程
.start()
#停止串口线程
def StopThread(self):
if is not None:
.SetAlive(False)
.quit()
.wait()
.exit()
= None
用来打开和关闭线程,接着实现回调函数:
def callbacklog(self,msg):
if len(msg)>0:
cbcheck=()
try:
if cbcheck:
hdata=(msg)
(hdata)
else:
hdata=m('utf-8','replace')
(hdata)
except Exception as e:
(str(e))
在串口打开与关闭中增加:
()
()
如下所示:
好了,我们在cmd中运行一下,打开串口:
输入11,点击发送:
我们将自动收到发送的数据,接着关闭串口再打开:
输入0x11,勾选hex,点击发送:
好,我们本节课实现了串口数据的自动接收,当然这里的多线程使用while来读取数据,这样在数据多,或者程序多开的情况下有可能导致电脑卡慢,下一节课我们将使用别的方法来实现,当然串口的速率本来就不快,到此已经可以初步的满足正常使用了。