常见的串口调试助手一般只有简单的文本界面,偶然看到 Arduino IDE 自带的串口绘图工具,觉得用户设计挺友好。想着利用一下周末空闲时间,用 PyQt5 实现一个串口数据实时绘图小工具,在这里记录一下。

目录

1 用户界面

2 串口通信

3 实时绘图


1 用户界面

使用 Qt Designer 可以快速地设计用户界面,界面主体是绘制曲线的区域,下面放置两个 ComboBox,分别用于设置串口号和波特率,然后在右下角放一个按钮。

波特率下拉框勾选 editable,以支持自定义波特率,然后添加一些 ComboBox 项目,使用预览模式修改字体样式。

保存 ui 文件,使用 pyuic 工具进行转换。接着创建新的 py 文件,调用 setupUi() 函数实现 ui 界面。

from PyQt5 import Qt, QtGui, QtCore, QtWidgets
from ui_SerialPlot import Ui_Formclass SerialPlot(Qt.QWidget):def __init__(self):super().__init__()self.ui = Ui_Form()self.ui.setupUi(self)if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)window = SerialPlot()window.show()sys.exit(app.exec_())

2 串口通信

串口通信部分用到了 QSerialPort 和 QSerialPortInfo,使用以下语句导入:

from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo

在启动程序的时候,遍历一次串口信息,然后使用 addItem() 函数添加识别到的串口号到 ComboBox 中。

def __init__(self):# ...# 定义串口对象self.COM = QSerialPort()self.port_list = QSerialPortInfo.availablePorts()# 读取串口信息,并选择第一个串口for com_port in self.port_list:self.ui.comport_comboBox.addItem(com_port.portName())self.COM.setPortName(self.port_list[0].portName())# 设置回调函数self.ui.comport_comboBox.activated[str].connect(self.on_comport_changed)self.ui.baudrate_comboBox.activated[str].connect(self.on_baudrare_changed)# ...def on_comport_changed(self, com_port):self.COM.setPortName(com_port)def on_baudrare_changed(self, baud_item):baud_rate = int(baud_item.split(' ')[0])self.COM.setBaudRate(baud_rate)

定义 on_pushbutton 函数,用于打开和关闭串口, 使用定时器每隔 100ms 读取一次串口数据。

def __init__(self):# ...# 串口相关self.open_status = 'closed'self.timer = QtCore.QTimer()self.timer.timeout.connect(self.on_timeout)self.ui.pushButton.clicked.connect(self.on_pushbuton)# ...def on_pushbutton(self):if self.open_status == 'closed':if not self.COM.open(QSerialPort.ReadWrite):returnself.timer.start(100)self.ui.pushButton.setText('STOP')self.open_status = 'opened'else:self.COM.close()self.timer.stop()self.ui.pushButton.setText('START')self.open_status = 'closed'def on_timeout(self):rcv_data = self.COM.readAll()if len(rcv_data) >= 2:print(int.from_bytes(bytes(rcv_data[0:2]), 'little'))

3 实时绘图

绘图部分用到了 pyqtgraph 库,使用以下语句导入:

import pyqtgraph as pg

在 __init__() 函数中定义 xdata 和 ydata,分别记录横轴和纵轴数据,并创建 PlotWidget 绘图控件到主窗口中。

def __init__(self):# ...# 创建 PlotWidget 对象self.plotwidget = pg.PlotWidget(self, background='w')self.plotwidget.setGeometry(QtCore.QRect(10, 10, 480, 270))# 曲线相关self.xdata = []self.ydata = []self.time = 0self.pen = pg.mkPen(color='#bc5001', width=2)self.curve = self.plotwidget.Plot(self.xdata, self.ydata, pen=self.pen)# ...

最后修改之前的 on_timeout() 函数,更新曲线数据。

def on_timeout(self):rcv_data = self.COM.readAll()if len(rcv_data) >= 2:value = int.from_bytes(bytes(rcv_data[0:2]), 'little')self.xdata.append(self.time * 0.100)self.ydata.append(value)self.time += 1self.curve.setData(self.xdata, self.ydata)

用 numpy 库随机模拟一些数据,测试一下绘图效果,大功告成。

【PyQt5】串口数据实时绘图相关推荐

  1. android 串口一直打开_实例 | 使用Python串口实时显示数据并绘图

    今天为大家分享一篇使用Python串口实时显示数据并绘图的例子,具有很好的参考价值,希望对大家有所帮助. 一.安装pyserial以及基本用法 使用pyserial进行串口传输,在cmd下输入命令pi ...

  2. python串口数据绘图_使用Python串口实时显示数据并绘图的例子

    使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:\Anaconda3\Sc ...

  3. python中texttable库显示实时数据_用Python串口实时显示数据并绘图pyqtgraph

    用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...

  4. 用Python串口实时显示数据并绘图pyqtgraph(详细教程)

    用Python串口实时显示数据并绘图 使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 &qu ...

  5. python读取串口数据 绘图_使用Python串口实时显示数据并绘图的例子

    使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:Anaconda3Scri ...

  6. 用Python串口实时显示数据并绘图

    使用pyserial进行串口传输 一.安装pyserial以及基本用法 在cmd下输入命令pip install pyserial 注:升级pip后会出现 "'E:\Anaconda3\Sc ...

  7. 基于MATLAB GUI界面的MCU串口实时绘图设计

    本文主要介绍如何利用MATLAB中的GUI工具来制作串口通信上位机,然后利用单片机读取陀螺仪MPU6050的 数据传送到上位机,利用上位机将数据利用绘图实时显示出来,有一部分是参考网上其它教程, 将在 ...

  8. 基于matlab的绘图设计,基于MATLABGUI界面MCU串口实时绘图的设计.pdf

    基于MATLABGUI界面MCU串口实时绘图的设计 基于MATLABGUI界面的MCU串口实时绘图设计 李华志 尹俊峰 王亚飞 中国地质大学(武汉)自动化专业073082班 湖北 武汉 430074 ...

  9. Android(Linux)实时监控串口数据

    之前在做WinCE车载方案时,曾做过一个小工具TraceMonitor,用于显示WinCE系统上应用程序的调试信息,特别是在实车调试时,用于监控和显示CAN盒与主机之间的串口数据.因为需要抢占市场先机 ...

  10. Windows10下VB6.0开发——利用PictureBox控件实现数据点实时绘图

    前言:VB中可以利用PictureBox控件实现数据点实时绘图功能. 1. 控件PictureBox   下面是PictureBox的图标:   将该控件拖到目标位置后调整它的形状大小,修改它的背景色 ...

最新文章

  1. Fastp对fastq质控
  2. 解决Office 2010出现the setup controller has encountered a problem...
  3. python实现tcp通信_Python实现简易TCP通信程序
  4. onkeyup,onkeydown和onkeypress
  5. [CSS]BlendTrans滤镜
  6. ostu进行遥感图像的分割
  7. python逐行读取txt写入excel_用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)...
  8. php ip2long mysql,PHP基于ip2long实现IP转换整形
  9. 图像下方出现几像素的空白间隙
  10. 功能实施方案,不能由程序员做主,一定要经过高手确认
  11. plc secs通讯协议_一种SECS/GEM通讯方法与流程
  12. RecordCount
  13. 光纤收发器和交换机之间有什么区别?
  14. 2021年N1叉车司机新版试题及N1叉车司机考试试卷
  15. java学习笔记(7)
  16. MFC与DX11结合
  17. android+代码调用+相册+小米,Android调用系统相册选择图片,支持小米4云相册
  18. 博客设计展示:25个优秀博客设计
  19. 2022-09-06 Android输入法顶起输入框,遮挡RecyclerView
  20. C# 把时间转为秒_Python基础学习笔记(六)日期与时间

热门文章

  1. 人大金仓数据库高可用集群部署教程
  2. 学习c语言-----输出图形
  3. 【通信原理 入坑之路】—— 仔细聊聊关于“采样”的那点事儿
  4. 单片机的c语言程序设计与应用考题,单片机的C语言程序设计与应用—基于Proteus仿真(第4版)...
  5. STM32使用485接口通讯
  6. vmware workstation server 服务无法启动
  7. 网络操作系统发展历程
  8. 让金山词霸 支持谷歌翻译
  9. 网页视频html转换ppt,ppt转web ppt可以转换为视频文件?
  10. 上网本之必备网络工具推荐