pyqt中如何使用threading库开启一个线程实时接收串口发送的数据
时间: 2024-02-24 16:54:49 浏览: 174
使用 `threading` 库开启一个线程实时接收串口发送的数据,需要将串口读取的函数放入线程中运行,并且在主线程中实时更新界面显示。
以下是一个简单的示例代码,可以实现实时接收串口发送的数据并显示在界面上:
```python
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import serial
import threading
class SerialThread(QThread):
# 自定义信号,用于向主线程发送串口数据
serial_data = pyqtSignal(str)
def __init__(self, port, baudrate):
super().__init__()
self.port = port
self.baudrate = baudrate
self.serial = None
self.is_running = True
def run(self):
# 打开串口
self.serial = serial.Serial(self.port, self.baudrate, timeout=0.5)
while self.is_running:
# 读取串口数据
data = self.serial.readline().decode('utf-8').strip()
# 发送信号,将串口数据传递给主线程
self.serial_data.emit(data)
# 关闭串口
self.serial.close()
def stop(self):
# 停止线程
self.is_running = False
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('Serial Reader')
self.setGeometry(100, 100, 400, 300)
# 创建界面控件
self.serial_port_label = QLabel('Serial Port:')
self.serial_port_combo = QComboBox()
self.serial_port_combo.addItems(['COM1', 'COM2', 'COM3', 'COM4'])
self.baudrate_label = QLabel('Baudrate:')
self.baudrate_combo = QComboBox()
self.baudrate_combo.addItems(['9600', '115200'])
self.start_button = QPushButton('Start')
self.stop_button = QPushButton('Stop')
self.serial_data_label = QLabel('Serial Data:')
self.serial_data_edit = QTextEdit()
# 设置布局
grid_layout = QGridLayout()
grid_layout.addWidget(self.serial_port_label, 0, 0)
grid_layout.addWidget(self.serial_port_combo, 0, 1)
grid_layout.addWidget(self.baudrate_label, 1, 0)
grid_layout.addWidget(self.baudrate_combo, 1, 1)
grid_layout.addWidget(self.start_button, 2, 0)
grid_layout.addWidget(self.stop_button, 2, 1)
grid_layout.addWidget(self.serial_data_label, 3, 0)
grid_layout.addWidget(self.serial_data_edit, 3, 1)
self.setLayout(grid_layout)
# 连接信号槽
self.start_button.clicked.connect(self.start_serial_thread)
self.stop_button.clicked.connect(self.stop_serial_thread)
self.serial_data_edit.setReadOnly(True)
def start_serial_thread(self):
# 创建串口线程并启动
self.serial_thread = SerialThread(self.serial_port_combo.currentText(), int(self.baudrate_combo.currentText()))
self.serial_thread.serial_data.connect(self.update_serial_data)
self.serial_thread.start()
def stop_serial_thread(self):
# 停止串口线程
self.serial_thread.stop()
self.serial_thread.wait()
def update_serial_data(self, data):
# 更新界面显示串口数据
self.serial_data_edit.append(data)
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
在上述代码中,`SerialThread` 类继承自 `QThread`,并在 `run` 方法中运行串口读取函数。`serial_data` 信号用于向主线程发送串口数据。
`MainWindow` 类为主窗口类,包含了串口选项、开始按钮、停止按钮和串口数据显示区域。`start_serial_thread` 方法用于创建并启动串口线程,并将串口数据更新函数与 `serial_data` 信号连接。`stop_serial_thread` 方法用于停止串口线程。`update_serial_data` 方法用于更新界面显示串口数据。
在 `if __name__ == '__main__':` 代码块中创建 `QApplication` 对象和 `MainWindow` 对象,并启动应用程序。
阅读全文