【PyQt5】串口数据实时绘图

2023-05-16

常见的串口调试助手一般只有简单的文本界面,偶然看到 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_Form


class SerialPlot(Qt.QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)

if __name__ == "__main__":
    import sys
    app = 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):
            return
        self.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 = 0
    self.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 += 1
        self.curve.setData(self.xdata, self.ydata)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PyQt5】串口数据实时绘图 的相关文章

  • 当在字符串中按下 QpushButton 时,如何在 QlineEdit 中获取文本?

    我正在尝试实现一个功能 我的代码如下 当用户单击名为 connect 的按钮时 我想在 shost 字符串中获取带有对象名 host 的 lineedit 中的文本 我怎样才能做到这一点 我尝试过但失败了 我该如何实现这个功能呢 impor
  • YouTube 视频嵌入 pyqt

    如何使用 PyQt5 嵌入 youtube 视频 我尝试执行以下操作 但它给了我一个未解决的错误 DirectShowService doRender 未解决的错误代码 from PyQt5 import QtWidgets QtCore
  • PyQt5 按钮未连接

    我正在尝试使用 PyQT5 构建一个简单的 GUI 其中有 3 个按钮用于打开文件浏览器 还有一个按钮用于对所选文件进行处理 但我无法让按钮连接到执行此操作所需的功能 In the Ctrl类 该 connect signals函数似乎没有
  • 如何在调用 gnuplot 时保持 PyQt5 响应?

    我正在尝试使用 Python GUI 和 gnuplot 创建绘图 我正在用 Python 生成代码并将其发送到 gnuplot 这基本上适用于将数据传输到 gnuplot 但是 缺点 Python 程序将被阻止 直到您关闭 gnuplot
  • 如何将列表中的行插入到QSqlTableModel中?

    下面是我的示例代码 class UI QMainWindow def init self super UI self init uic loadUi tableview ui self self show db QSqlDatabase a
  • 使用 PyQt5,如何使 QComboBox 可搜索?

    我正在使用 PyQt5 制作 GUI 在它上面 我有一个 QComboBox 其中有一个包含 400 多个项目的下拉列表 我想知道是否有什么方法可以在 QComboBox 中输入来搜索匹配的案例 你可以使用QCompleter为了这 对于可
  • 从控制台上的 PyQt5 浏览器中删除日志

    我有一个 PyQt5 应用程序虚拟桌面 https github com DSSecret Studios Dev Virtual Desktop有一个内置浏览器 当我使用浏览器时 我从浏览器中收到 JS 错误 类似于 Chrome 在 W
  • 如何从 Python 文件更新 Qml 对象的属性?

    我想在 Qml 中显示一个矩形 并且想从我的 python 代码中更改矩形的属性 宽度 长度 实际上 Python代码中有一个套接字连接 通过该连接从另一台计算机接收宽度和长度的值 简单地说 另一个用户应该能够实时调整这个矩形 我知道如何在
  • 为什么 QGridLayout 小部件在添加新小部件时会移动?

    我似乎无法理解它们是如何工作的 放置多个小部件的最佳方式似乎是 QGridLayout 但是当我将某些内容添加到特定的行 列中 然后决定将某些内容添加到另一行 列中时 一切都会发生变化 这真的很令人沮丧 例如 我什至无法做像谷歌主页这样简单
  • pylint 找不到 QWidget 和 QApplication

    import sys from PyQt5 QtWidgets import QApplication QWidget app QApplication sys argv window QWidget window setGeometry
  • 如何在PyQt5应用程序中显示来自moviepy的write_audiofile的转换进度?

    我想使用 moviepy 库中的 write audiofile 函数将 mp4 文件转换为 mp3 文件 并使用进度条在 PyQT5 应用程序中显示进度 当我使用时 mp4audio write audiofile filename lo
  • PyQt5:派生 QWidget 类中带有元类的 Mixin 的问题

    我在尝试将具有元类的 mixin 添加到基类是 QWidget 的类时遇到问题 我知道 PyQt5支持协作多重继承 http pyqt sourceforge net Docs PyQt5 multiinheritance html如果我的
  • 无法从源代码构建 qtermwidget

    我正在尝试建立qterm小部件 https github com lxqt qtermwidget来自源头 但它给了我错误 我已经成功构建了lxqt 构建工具 https github com lxqt lxqt build tools 然
  • 线程处理时出现 msgbox 错误,GUI 块 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在执行以下 gui 时遇到问题 如果没有消息框 它可以正常工作 但是当有消息框时 它会阻塞 知道为什么 gui 在有消
  • 从 PyQt GUI 连接到串行

    我编写了一个程序来从串行发送和接收数据 但是我有一个问题 我想创建一个函数 connect 或一个类 当我按下按钮时 该函数就会被执行 但是如果我创建 MainWindow 类中的这个函数 TestThread 类中的变量 ser 未初始化
  • 如何在M1 arm64架构上安装PyQt5?

    我有一台 M1 mac 但我注意到 每当本机 python 运行任何自动化脚本 如 PyAutoGui 时 它都会逐渐变得越来越慢 几乎就像受到了限制一样 我用 Miniforge3 创建了一个能够利用 Apple 芯片的环境 使脚本运行得
  • 如何使 QTreeWidget 中的特定列成为整数/浮点数,以便用户无法输入任何字母或符号而不是整数/浮点数?

    我正在 PyQt5 中使用 QTreeWidget 制作 GUI 我希望特定列仅是整数列 用户不应该能够在其中输入任何非整数项 我看到了一些使用 QVariant 的方法 但它似乎不能满足我的要求 这就是我的found https stac
  • PyQt5:如何将 QPushButton 连接到插槽?

    好吧 几乎所有教程 可理解的用人类语言编写的文档都是针对 PyQt4 的 但是 PyQt5 改变了整个 将按钮连接到插槽 的工作方式 但我仍然不知道如何做到这一点 我在 QtDesigner 中做了一个快速 gui 并且有一个 QPushB
  • 如何在QTextEdit中自动滚动文本(动画效果)?

    我想问一下如何让QTextEdit中的文字滚动 达到动画效果 动画效果应该类似于视频中所示的效果 https www youtube com watch v MyeuGdXv4XM https www youtube com watch v
  • pyqt5调用url时处于无响应状态

    我刚刚在 pyqt 中实现了登录 但在调用 url 和获取响应之间 qt 窗口显示无响应状态 谁能建议我如何避免不响应状态 code class Login QDialog def init self height width parent

随机推荐

  • C++ 铪铪铪铪 烫烫烫 屯屯屯

    VS中 xff0c Debug模式下 xff0c 对于未初始化的内存 xff1a 1 xff09 若为栈内存 xff0c 默认为一连串 烫烫烫 xff0c 0xcc 2 xff09 若为堆内存 xff0c 默认为一连串 屯屯屯 xff0c
  • 创新的力量

    创新是个非常好的词 xff0c 虽然这个词已经被用滥了 xff0c 但我依然固执的认为这是一个充满了迷人光辉的词汇 如果把创新放入科技领域 xff0c 这应该是我在科技领域最喜欢的一个词了 我常常对同事或团队的成员说 xff0c 我们在做产
  • 魔方矩阵

    看到魔方矩阵 xff0c 好奇 xff0c 好玩儿 xff0c 正好赶上周五 xff0c 就来放松一下 xff0c 总结一下几种魔方矩阵的规律 xff0c 并写一下C 43 43 实现过程 定义 xff1a 平面魔方的一般定义 xff1a
  • 样条插值曲线类型及其优缺点说明

    Spline Types This page gives a breakdown of each spline type how to use each one and the advantages disadvantages of eac
  • caffe layer层详解

    1 基本的layer定义 xff0c 参数 1 基本的layer定义 xff0c 参数 如何利用caffe定义一个网络 xff0c 首先要了解caffe中的基本接口 xff0c 下面分别对五类layer进行介绍 Vision Layers
  • caffe编译中的python问题

    问题 usr include boost python detail wrap python hpp 50 23 fatal error pyconfig h No such file or directory 解决方案 make clea
  • latex图像注释位置

    latex图像注释的位置在左边 不知道谁把模板里的 usepackage caption 给注释掉了
  • pytorch pretrained model

    pytorch pretrained model two methods method 1 比较大小 self span class token punctuation span model span class token operato
  • 嵌入式100题(76):中断和异常的区别

    中断和异常的区别 1 异常 是指CPU内部出现的中断 即在CPU执行特定指令时出现的非法情况 同时异常也称为同步中断 因此只有在一条指令执行后才会发出中断 不可能在指令执行期间发生异常 产生的原因 程序的错误产生的 编程异常通常叫做软中断
  • 字节序、大端序与小端序及其相关转换

    大端序与小端序及其相关转换 一 字节序定义 字节序 xff0c 为字节的顺序 xff0c 就是大于一个字节类型的数据在内存中的存放顺序 xff0c 一个字节的数据当然就没有顺序可言了 xff0c 其实大部分人在实际的开发中都很少会直接和字节
  • SkeyeLive开源流媒体PC端推拉流直播软件源码功能框架解析

    SkeyeLive是OpenSKEYE开源流媒体团队开发的一款功能丰富的开源PC端流媒体推流拉流直播软件项目 xff0c 目前支持Windows Android版本 xff0c 后续将支持ios版本 xff0c 其中Windows版本的Sk
  • 融资租赁业务系统(财务中台)

    融资租赁业务系统 财务中台 产品白皮书 版本号 xff1a V1 1 李雷 微信号 xff1a yanan122914 平台概述 融资租赁财务中台产品是一套专门针对融资租赁行业设计的融资租赁财务统一解决方案 对租赁公司传统的大单回租 直租
  • InfoQ推荐语:我的梦想

    大家好 非常高兴能在这一期的架构师和大家见面 本人工作了十余载 先后在洪恩软件和用友集团任职 目前任职于用友集团瑞友科技研究院 主要关注领域 企业应用软件平台研发 领域驱动设计 OSGi 动态语言应 用 云计算 移动互联和Mac OS平台相
  • 【MySQL】------数据库连接

    分享第十九条励志语录 要想飞起来 xff0c 首先要有飞翔的信念 xff0c 如果没有这个信念 xff0c 永远不可能飞起来 但只要有了飞翔的信念 xff0c 再加上自己的努力 xff0c 就有可能能够飞起来 成功也是这样 xff0c 要想
  • 无人机调试记录(一)

    无人机调试记录 xff08 一 xff09 固件 xff1a PX4 地面站 xff1a QGC APM xff08 pixhawk xff09 飞控疑难杂症解决方法汇总 校准 1 确保陀螺仪 水平线校准正确 如果校准完成后 xff0c Q
  • VsCode中使用git

    你是否厌倦了每天早上到公司都要打开git 小黑框 执行git clone 地址去拉取代码 而强大的VsCode只需要点一下即可解决 1 添加到暂存区 xff0c 更改文件以后可以发现 点进去上图这个标志 如果没有 xff0c 右击左侧菜单栏
  • 虚拟机上无法运行ubuntu自带的gazebo仿真器报VMware: vmw_ioctl_command error 无效的参数

    问题说明 xff1a 虚拟机版本 xff1a VMware Workstation 16 Pro Ubuntu版本 xff1a Ubuntu 18 04 现象 xff1a gazebo闪退 xff0c 并报 VMware vmw ioctl
  • NVIDIA JETSON TX2镜像制作以及刷机流程

    一 安装环境准备 xff1a Ubuntu宿主主机一台 xff0c TX2新老板子各一个 xff08 老的用来镜像备份 xff0c 用这个镜像给新的刷机 xff09 xff0c USB Micro USB线一根 1 下载TX2驱动 直接在百
  • 各种排序混合---冒泡排序、选择排序、插入排序

    冒泡排序 不多说 xff0c 看代码 xff0c 就是把最大的数字或者最小的数字沉到最右边 xff0c 最后输出数组 include lt iostream gt include lt stdlib h gt include lt math
  • 【PyQt5】串口数据实时绘图

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