python 串口 上位机_QT学习教程一之串口上位机补充(源码均有注释)
时间: 2023-06-24 08:04:46 浏览: 168
好的,下面是Python串口上位机QT学习教程一之串口上位机补充的源码注释:
```python
import sys
import serial
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QTextEdit, QHBoxLayout, QVBoxLayout, QLabel, QComboBox
class SerialThread(QThread):
receive_signal = pyqtSignal(str) # 定义接收信号
def __init__(self, port, baud_rate, parent=None):
super(SerialThread, self).__init__(parent)
self.port = port
self.baud_rate = baud_rate
self.is_running = False
def run(self):
try:
self.ser = serial.Serial(self.port, self.baud_rate, timeout=0.5)
except:
self.receive_signal.emit('串口连接失败')
return
self.is_running = True
while self.is_running:
data = self.ser.readline().decode('gbk')
if data:
self.receive_signal.emit(data)
def stop(self):
self.is_running = False
if hasattr(self, 'ser') and self.ser.isOpen():
self.ser.close()
class SerialWidget(QWidget):
def __init__(self):
super(SerialWidget, self).__init__()
self.serial_thread = None
self.port_label = QLabel('串口号')
self.port_combo = QComboBox()
self.baudrate_label = QLabel('波特率')
self.baudrate_combo = QComboBox()
self.open_button = QPushButton('打开串口')
self.close_button = QPushButton('关闭串口')
self.receive_label = QLabel('接收区域')
self.receive_text = QTextEdit()
self.send_label = QLabel('发送区域')
self.send_text = QTextEdit()
self.send_button = QPushButton('发送')
self.init_ui()
def init_ui(self):
# 添加串口号和波特率
self.port_combo.addItems(['COM{}'.format(i) for i in range(1, 21)])
self.baudrate_combo.addItems(['9600', '115200'])
# 按钮连接槽函数
self.open_button.clicked.connect(self.open_port)
self.close_button.clicked.connect(self.close_port)
self.send_button.clicked.connect(self.send_data)
# 接收区域只读
self.receive_text.setReadOnly(True)
# 布局
hbox1 = QHBoxLayout()
hbox1.addWidget(self.port_label)
hbox1.addWidget(self.port_combo)
hbox1.addWidget(self.baudrate_label)
hbox1.addWidget(self.baudrate_combo)
hbox1.addWidget(self.open_button)
hbox1.addWidget(self.close_button)
hbox2 = QHBoxLayout()
hbox2.addWidget(self.receive_label)
hbox3 = QHBoxLayout()
hbox3.addWidget(self.receive_text)
hbox4 = QHBoxLayout()
hbox4.addWidget(self.send_label)
hbox5 = QHBoxLayout()
hbox5.addWidget(self.send_text)
hbox5.addWidget(self.send_button)
vbox = QVBoxLayout()
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
vbox.addLayout(hbox3)
vbox.addLayout(hbox4)
vbox.addLayout(hbox5)
self.setLayout(vbox)
def open_port(self):
port = self.port_combo.currentText()
baud_rate = int(self.baudrate_combo.currentText())
self.serial_thread = SerialThread(port, baud_rate)
self.serial_thread.receive_signal.connect(self.receive_data) # 将接收到的信号连接到槽函数
self.serial_thread.start() # 启动线程
def close_port(self):
if self.serial_thread:
self.serial_thread.stop() # 停止线程
self.serial_thread.wait() # 等待线程退出
self.serial_thread = None
def send_data(self):
if not self.serial_thread or not self.serial_thread.is_running:
return
data = self.send_text.toPlainText() + '\r\n' # 加上换行符,因为有些设备需要
self.serial_thread.ser.write(data.encode())
def receive_data(self, data):
self.receive_text.insertPlainText(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
widget = SerialWidget()
widget.setWindowTitle('串口上位机')
widget.show()
sys.exit(app.exec_())
```
这是一个基于PyQt5和Python串口库serial实现的串口上位机程序,具有以下功能:
1. 打开和关闭串口
2. 发送数据
3. 接收数据
程序界面由一个QLabel、一个QComboBox、两个QTextEdit和三个QPushButton组成。其中,QLabel用来显示标签,QComboBox用来选择串口号和波特率,QTextEdit用来显示接收区域和发送区域,QPushButton用来打开和关闭串口、发送数据。
SerialThread是一个继承自QThread的线程类,用来处理串口通信,其中receive_signal是一个自定义的信号,用来发送接收到的数据。
SerialWidget是一个QWidget类,用来创建程序界面和处理用户交互。其中,open_port、close_port和send_data分别是打开串口、关闭串口和发送数据的槽函数,receive_data是接收数据的槽函数,用来更新接收区域。
在open_port函数中,首先获取当前选择的串口号和波特率,然后创建一个SerialThread对象,并将接收到的信号连接到receive_data槽函数,最后启动线程。在send_data函数中,如果线程不存在或者不在运行状态,直接返回,否则将发送区域的文本加上换行符后通过串口发送出去。在close_port函数中,首先停止线程,然后等待其退出并将其置为None。
最后,通过创建QApplication对象、SerialWidget对象并设置窗口标题并显示程序界面。
阅读全文