使用PySide2建立简单的串口测试工具。
1、建立界面
新建项目文件夹 serialtool,然后用VSCode打开并新建ui文件夹,右键使用 New Form 使用QtDesigner建立如下界面:
然后选择菜单 窗体->View Python Code,将代码复制后保存到ui文件夹下 serial_ui.py。
2、功能逻辑
- 主文件
添加主文件main.py,然后编写代码调用界面:
import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from PySide2.QtGui import *
from ui.serial_ui import Ui_MainWindow
class MainWindow(Ui_MainWindow, QMainWindow):
def __init__(self):
super(MainWindow,self).__init__()
self.setupUi(self)
if __name__ == '__main__':
app = QApplication(sys.argv)
mwin = MainWindow()
mwin.show()
sys.exit(app.exec_())
- 打开串口
这里使用PySide2中的QtSerialPort组件进行串口操作,首先是显示当前电脑可以使用的串口号到下拉列表控件中:
def __init__(self):
...
serial_list = QSerialPortInfo.availablePorts()
for port in serial_list:
self.comboSerialPort.addItem(port.portName())
然后新建串口对象并关联打开串口操作到按钮信号:
def __init__(self):
...
self.serial = QSerialPort()
self.btnConnect.setText('打开')
self.btnConnect.clicked.connect(self.open_serial)
def open_serial(self):
self.serial.setPortName(self.comboSerialPort.currentText())
if self.btnConnect.text() == '打开':
self.serial.open(QIODevice.ReadWrite)
self.serial.setBaudRate(int(self.comboBaudrate.currentText()))
self.btnConnect.setText('关闭')
else:
self.serial.close()
self.btnConnect.setText('打开')
这里有一点注意的是需要先打开串口,然后设置其波特率等参数。
- 数据发送功能
串口打开后就可以操作串口发送数据,将发送功能关联到发送按钮信号:
def __init__(self):
...
self.btnSend.clicked.connect(self.send_data)
def send_data(self):
if self.serial.isOpen():
str = self.editSend.text()+'\r\n'
ba = QTextCodec.codecForLocale().fromUnicode(str)
self.serial.write(ba)
这里需要将python字符串转换为Qt的QByteArray格式进行发送。
- 数据接收
数据接收直接关联接收函数到串口的 ReadyRead信号即可:
def __init__(self):
...
self.serial.readyRead.connect(self.read_data)
def read_data(self):
ba = self.serial.readAll()
str = QTextCodec.codecForLocale().toUnicode(ba.data())
self.editRecv.appendPlainText(str)
- 最后简单美化下界面
if __name__ == '__main__':
...
qtmodern.styles.dark(app)
mwin = MainWindow()
win = qtmodern.windows.ModernWindow(mwin)
win.show()
- 效果如下:
代码仓库:https://github.com/makerinchina-iot/Monkey-Helper-Tools-py
版权声明:本文为博主原创文章,转载请声明。