一种常用的方法是使用多线程,将串口读取和GUI更新分别放入不同的线程中运行。这样可以保证每个线程独立运行,串口阻塞不会影响GUI的更新,GUI的更新也不会阻塞串口的读取。
下面是一个示例代码:
from PyQt5.QtCore import QThread, pyqtSignal
import serial
class SerialThread(QThread):
sig_data_received = pyqtSignal(str)
def __init__(self, port, baudrate):
super().__init__()
self.port = port
self.baudrate = baudrate
self.serial = None
def run(self):
self.serial = serial.Serial(self.port, self.baudrate)
while True:
data = self.serial.readline().decode("utf-8")
self.sig_data_received.emit(data)
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.thread_serial = SerialThread("COM1", 115200)
self.thread_serial.sig_data_received.connect(self.handle_data_received)
self.thread_serial.start()
self.label = QLabel()
self.setCentralWidget(self.label)
def handle_data_received(self, data):
self.label.setText(data.strip())
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MyApp()
window.show()
sys.exit(app.exec_())
这个示例中,SerialThread是一个继承自QThread的子类,用于串口读取。当数据读取完毕时,会发射sig_data_received信号,然后在主线程中的handle_data_received()方法中更新GUI。在MyApp的构造方法中,我们创建SerialThread对象并启动,然后设置一个label为GUI展示数据。串口的读取和GUI的更新都在各自的线程中运行,互不干扰,可以避免阻塞。