我正在使用 pyserial 与我的 arduino 通信。我使用 Pyqt 作为 GUI。 我已经实现了一个监听串口的工作线程:
class Worker(QObject):
finished = pyqtSignal()
intReady = pyqtSignal(str)
s_connect = pyqtSignal()
s_position = pyqtSignal(str)
s_console = pyqtSignal(str)
s_infoPosSpeed = pyqtSignal(list)
@pyqtSlot()
def __init__(self):
super(Worker, self).__init__()
self.working = True
self.ser = None
def setSer(self, ser):
self.ser=ser
def work(self):
message = ""
while self.working:
line = self.ser.readline().decode('utf-8')
if(line!= ""):
message +=line
message=message.strip()
if message != "" and ";" in message:
i = message.index(";")
print("newMessage=>",message)
subString = message[0:i]
if subString == "connack":
self.s_connect.emit()
self.s_console.emit("Verbindung hergestellt")
message = message[i+1:]
print(time.clock())
time.sleep(0.1)
self.finished.emit()
一般来说效果很好。然后我从主窗口打开一个对话框。我正在使用函数 keyPressEvent
来检测键盘上的按键:
def keyPressEvent(self, event):
pressed = event.key()
if event.isAutoRepeat():
return
if pressed == LEFT:
self.b_left.setEnabled(False)
self.parent.ser.write("left;".encode())
if pressed == RIGHT:
self.b_right.setEnabled(False)
self.parent.ser.write("right;".encode())
if pressed == UP:
self.b_up.setEnabled(False)
self.parent.ser.write("up;".encode())
if pressed == DOWN:
self.b_down.setEnabled(False)
self.parent.ser.write("down;".encode())
event.accept()
只要我按下一个键,工作线程就会停止工作。我明白这是因为 print(time.clock())
在松开按键后停止并继续。
这是已知行为还是因为我的实现?
谢谢