这可能也是我毕业设计的最终章了,由PyQt5创建两个线程,数据读取的线程负责读取Arduino发送的距离信息,主线程负责倒车雷达动画的实时显示。还是要认真一点,也算是给大学毕业一个交代。
然而还不开学
是因为多进程之间不共享变量,不便操作
。
而倒车雷达也是如上的道理,需要两个线程,第一个显示线程来维护界面的显示,第二个串口线程来不断的读取距离数据和发送控制指令。因此,创建和串口进行交互的类(基于pyserial这个库)。因为需要将读取的距离信息返回主程序,所以在这个类内将读取的距离数据通过
pyqt信号
的形式发送。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
class Com(QThread): my_signal = pyqtSignal(str)
def __init__(self): super(Com, self).__init__() self.data = "" self.is_on = True self.s = serial.Serial(port='COM6', baudrate=9600, stopbits=serial.STOPBITS_ONE)
def recv(self): while True: self.sleep(1) data = self.s.readline() if data == '': continue else: break return data
def run(self): while self.is_on: if self.s.isOpen(): print("open success") else: print("open failed")
while True: self.data = self.recv() self.my_signal.emit(str(self.data))
def stop(self): self.s.write(b"2")
def forward(self): self.s.write(b"0")
def back(self): self.s.write(b"1")
def left(self): self.s.write(b"3")
def right(self): self.s.write(b"4")
def begin(self): self.s.write(b"5")
def lift(self): self.s.write(b"6")
|
在主程序中实例化这个线程的类,并通过start方法来启动。因为这个类会不断的将距离信息作为信号通过emit方法进行反馈。因此我们需要将这个信号连接至一个函数,那么这个函数就可以读取返回的距离信息。
1 2 3 4 5 6 7 8
|
self.com = Com() self.com.my_signal.connect(self.run)
self.com.start()
def run(self, distance): self.dis = distance
|
https://github.com/muyuuuu/Reversing-radar-on-Arduino/blob/master/code/Reverse-radar/view.py