在CSDN上学习了众多资料,调试了一个基于python的简易串口软件,作为一个学习的总结。整个软件并不复杂,汇集了不少网上找到的代码,甚至比较简陋,只是实现了预定的功能,还有很大优化的空间,希望能够给大家提供一个思路,供大家参考。
程序虽然不大,却遇到了不少问题。(1)使用虚拟串口软件VSPD,在python中,使用serial.tools.list_ports却识别不到。后来在网上搜索一下,需要重启电脑。我先关机,再开机,似乎无效,重启后,终于了可以识别到虚拟的串口了。(2) 安装pyqtgraph后,使用pyqtgraph老是闪退,无法显示图形。在另外一台电脑却可以正常那运行。出现问题时,系统是win0,pyqtgraph版本是0.12.4,python版本3.7。使用官方自带例程
import pyqtgraph.examples
pyqtgraph.examples.run()
打开ImageView也是闪退,后来把pyqtgraph降级到0.12.1,终于可以正常运行了。
python程序显示界面如下:
程序实现的主要功能有:(1)打开关闭串口 (2)显示及发送数据 (3)动态显示波形。使用主要技术包含(1)逻辑与界面相互分离 (2)多线程技术。
程序使用的主要库:串口相关pyserial serial 绘图相关pyqtgraph 波形scipy 延迟time等。
from scipy import signal
signal.square(2 * np.pi * f0 * t) # 产生方波
signal.sawtooth(2 * np.pi * f0 *t*0.01, 0.5) # 产生三角波
逻辑与界面相互分离,并且重定义了关闭按钮,需要再次确认:
from SerialUI import Ui_MainWindow from PyQt5 import QtCore,QtWidgets import sys class SerialTool(Ui_MainWindow,QtWidgets.QMainWindow): def __init__(self, parent = None): super(SerialTool, self).__init__(parent) self.setupUi(self) self.setupInit() def setupInit(self): pass def closeEvent(self,event): reply = QtWidgets.QMessageBox.question(self, 'Message', "确定要退出吗?", QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No) # 判断返回值,如果点击的是Yes按钮,就关闭组件和应用,否则就忽略关闭事件 if reply == QtWidgets.QMessageBox.Yes: event.accept() else: event.ignore() if __name__ == "__main__": QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling) app = QtWidgets.QApplication(sys.argv) myWin = SerialTool() myWin.show() sys.exit(app.exec_())
为了避免界面卡顿,使用多个线程。(1)波形产生线程 (2)波形处理线程 (3))主页面通过timeout 接受串口数据,并且将数据发送给 接收窗口和波形处理线程。简易框架如下:
自定义线程通过非科学方式,继承QThread的方式,定义子进程。在主函数里开启进程,并绑定槽函数。
虚拟串口绑定串口2和串口3。在两个pycharm中分别运行程序,一个程序作为串口发送端,一个程序作为串口接收端。程序运行效果如下:
正弦波显示:
方波显示:
三角波显示:
程序也可以不接入串口,通过程序内部的按键显示绘图,分别显示正弦波,方波等。
由于没有完整测试过,可能会有一些bug,主程序下载链接如下,只包含了main 函数,UI函数需要自己再整理: