【PyQt】PyQt5进阶——串口上位机及实时数据显示

这篇具有很好参考价值的文章主要介绍了【PyQt】PyQt5进阶——串口上位机及实时数据显示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 前期教程

  • 【Python】PyQt5入门

1 前言

  最近在用PyQt做一个串口上位机,需要串口通信和实时显示曲线。这里简单记录一些关键点。

2 串口部分——QtSerialPort

  这个是在安装PyQt5时自动安装的组件,使用方法比较简单,主要是两个模块:QSerialPort, QSerialPortInfo

# 导入包
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo

#获取当前的所有串口,得到一个列表
portlist = QSerialPortInfo.availablePorts()
#获取串口的名称和描述
l = [x.portName()+x.description() for x in self.portlist] 
#建立一个串口,里面的参数可以填串口名或者就是串口类
ser = QSerialPort()
#接收数据对应调用的函数
ser.readyRead.connect(recv_data)

#设置串口
def init_port(self, port:QSerialPort):
	port.setBaudRate(self.baud)
	port.setDataBits(QSerialPort.DataBits.Data8)
	port.setParity(QSerialPort.Parity.NoParity)
	port.setStopBits(QSerialPort.StopBits.OneStop)
	port.readyRead.connect(recv_data)

#数据接收
data = ser.readAll().data() #得到的是字节字符串

  以上就是串口部分的代码,比较简单,利用代码提示基本没有什么问题。

关于字节字符串的处理可以看一下这篇文章

  • 【学习笔记】字节数据和字节字符串(b“ “)那些事

3 绘图部分

  经过调研,发现在Qt当中绘制函数曲线,常用的有3个包,分别是QCustomPlot , QWTQtChart,其中前两者都是第三方包,后者是Qt官方做的,不过三者都兼容PyQt5就是了

3.1 QCustomPlot

  QCustomPlot目前在pypi上好像有好几个版本

pyqt5串口上位机,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

除此之外,如果直接运行pip install QCustomPlot2也是可以安装的,而且用着感觉和QCustomPlot-PyQt5没什么区别,所以也不知道啥有这么多的版本。

  不过这个包有一个最大的问题,那就是它对Python的支持不够好。网上有很多关于这个包在C环境下的使用,但是Python环境下却不支持代码提示,安装的包是一个编译过的pyd文件。

  以下是一个例子

import sys
import math
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPen, QBrush, QColor
from PyQt5.QtWidgets import QApplication, QMainWindow

from QCustomPlot2 import QCustomPlot, QCP
#以上QCustomPlot2完全可以直接换成QCustomPlot-PyQt5

app = QApplication(sys.argv)
window = QMainWindow()
window.resize(800, 600)

customPlot = QCustomPlot()
window.setCentralWidget(customPlot)

graph0 = customPlot.addGraph()
graph0.setPen(QPen(Qt.blue))
graph0.setBrush(QBrush(QColor(0, 0, 255, 20)))

graph1 = customPlot.addGraph()
graph1.setPen(QPen(Qt.red))

x, y0, y1 = [], [], []
for i in range (251):
    x.append(i)
    y0.append(math.exp(-i/150.0)*math.cos(i/10.0))  # exponentially decaying cosine
    y1.append(math.exp(-i/150.0))                   # exponential envelope

graph0.setData(x, y0)
graph1.setData(x, y1) #除setData外,还有addData函数,即添加一个点

customPlot.rescaleAxes()
customPlot.setInteraction(QCP.iRangeDrag)
customPlot.setInteraction(QCP.iRangeZoom)
customPlot.setInteraction(QCP.iSelectPlottables)

window.show()
sys.exit(app.exec_())

以下是在类中的使用参考:

def initPlot(self):
    self.ui.widget

    self.ui.widget.setInteractions(QCP.iRangeDrag | QCP.iRangeZoom | QCP.iSelectAxes | QCP.iSelectLegend | QCP.iSelectPlottables)
    # self.ui.widget.axisRect().setRangeZoomAxes(, self.ui.widget.yAxis)
    self.ui.widget.xAxis.setLabel("t")
    self.ui.widget.yAxis.setLabel("accel")
    self.ui.widget.legend.setVisible(True)
    self.ui.widget.yAxis.setRange(-2,2)

    self.ui.widget.axisRect().insetLayout().setInsetAlignment(0, Qt.AlignLeft|Qt.AlignTop)

    self.ui.widget.addGraph()#添加第1条曲线
    self.ui.widget.graph(0).setName("x")#曲线名称
    self.ui.widget.graph(0).setPen(QPen(Qt.red)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第2条曲线
    self.ui.widget.graph(1).setName("y")#曲线名称
    self.ui.widget.graph(1).setPen(QPen(Qt.blue)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第3条曲线
    self.ui.widget.graph(2).setName("z")#曲线名称
    self.ui.widget.graph(2).setPen(QPen(Qt.green)) # line1 color red for second graph

    self.ui.widget.addGraph()#添加第4条曲线
    self.ui.widget.graph(3).setName("norm")#曲线名称
    self.ui.widget.graph(3).setPen(QPen(Qt.cyan)) # line1 color red for second graph

    self.key_init = QDateTime.currentDateTime().toMSecsSinceEpoch()/1000

def fresh(self, x=0, y=0, z=0, norm=0):
    key = QDateTime.currentDateTime().toMSecsSinceEpoch()/1000 - self.key_init
    self.ui.widget.graph(0).addData(key, x)
    self.ui.widget.graph(1).addData(key, y)
    self.ui.widget.graph(2).addData(key, z)
    self.ui.widget.graph(3).addData(key, norm)
    self.ui.widget.rescaleAxes()

    # self.ui.widget.xAxis.setRange(self.x, 8, Qt.AlignRight)
    self.ui.widget.replot()

3.2 QtChart

  使用前先安装:pip install PyQtChart,在使用这个包时,要注意其基本的逻辑。显示的类为QChartView, 但是QChartView需要关联一个QChart,而每个QChart可以包含一个或多个series,即一条或多条曲线,当然series类型有很多,这个和曲线计算方式和想要绘制图形的类型有关。看个例子。

import sys
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
from PyQt5.QtChart import QLineSeries, QChart, QChartView
def create_chart():
    # 创建折线图的数据
    series = QLineSeries()
    series.append(0, 0)
    series.append(1, 1)
    series.append(2, 2)
    series.append(3, 3)
    chart = QChart()
    chart.addSeries(series)
    chart.setTitle('Chart Example') # 设置图表标题
    chart.setAnimationOptions(QChart.SeriesAnimations) # 设置动画效果
    return chart
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle('QtChart Example')
        chart_view = QChartView(create_chart())

        chart_view.setRenderHint(QPainter.Antialiasing) # 设置渲染方式
        self.setCentralWidget(chart_view)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

//2023.5.16
这个有一点需要注意的是,序列,坐标系,图表的建立要遵循一定的顺序,具体可以参考这篇博客中的代码。

3.3 QWT

  这个没有用过,但是感觉还行,也有代码提示,安装方法:

# 一定要安装这个包,否则无法使用
pip install pyqt5-tools
# 再安装对应的包
pip install PythonQwt

这里给一个pypi官网提供的例子:

from qtpy import QtWidgets as QW
import qwt
import numpy as np

app = QW.QApplication([])
x = np.linspace(-10, 10, 500)
plot = qwt.QwtPlot("Trigonometric functions")
plot.insertLegend(qwt.QwtLegend(), qwt.QwtPlot.BottomLegend)
qwt.QwtPlotCurve.make(x, np.cos(x), "Cosinus", plot, linecolor="red", antialiased=True)
qwt.QwtPlotCurve.make(x, np.sin(x), "Sinus", plot, linecolor="blue", antialiased=True)
plot.resize(600, 300)
plot.show()
app.exec_()

3.4 Qt Designer中如何使用

  在上面的前期教程当中,有提到PyQt常用的开发方式,就是在Qt Designer中设计ui,然后转换成py文件,再另写一个py文件进行界面的显示和处理。那这些曲线怎么在Qt Designer中设计呢?

  在需要显示的位置放置一个Widget控件:

pyqt5串口上位机,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

然后右键该控件,选择“提升为”

pyqt5串口上位机,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

pyqt5串口上位机,# Python,pyqt,python,qtchart,QCustomPlot,Qwt

这里主要是填两个空,即提升的类名称和头文件,由于Python当中没有头文件,实际填的是模块名。即保证结构是from B import A,其中A应该是一个显示的类,具体应该填什么根据使用的包决定。比如如果使用的是QtChart,那么应该是from PyQt5.QtChart import QChartView文章来源地址https://www.toymoban.com/news/detail-528747.html

参考链接

  • PyQt5 QSerialPort子线程操作
  • Python3+PyQt5+QtChart 实现简单的实时更新曲线图
  • QChart的简单使用
  • Qwt、QChart、QCustomPlot使用
  • PyQtChart

到了这里,关于【PyQt】PyQt5进阶——串口上位机及实时数据显示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python进阶-PyQt5】00搭建PyQt5环境

    我们编写的程序,有时用到的Python库是不一样的,比如说开发桌面应用程序我们主要用到PyQt5相关的Python库、开发Web应用程序我们主要用到Django相关的Python库等等。假设我们在开发桌面应用程序的时候除了PyQt5相关的Python库外,还附加了其他的Python库,比如有关Django的Python库。

    2024年02月08日
    浏览(42)
  • QT串口调试助手开发教程:上位机接收数据解析数据帧+多通道波形显示+数据保存

    在该设计中主要需要解决的问题就是接收单片机采集到的数据并在上位机将数字实时的通过波形显示出来,然后上位机要有保存下数据文件的功能,便于后续的软件读取数据做进一步的分析处理。有些人吃相难看,无底线,无道德,鉴于串口上位机会被广泛使用,撰写该教程

    2024年02月07日
    浏览(46)
  • 制作一个串口助手 | python + pyqt5

    目录 一、背景 1.1、开发流程图 二、前提 2.1、关于环境 2.2、关于源码 三、步骤 3.1、使用pyqt创建一个.ui界面并生成.py文件 3.2、创建两个.py文件,一个用来继承ui界面生成的.py类,一个用来实现各种功能 3.3、各个功能代码 3.3.1、打开串口 3.3.2、关闭串口 3.3.3、获取串口号 3.

    2024年02月05日
    浏览(85)
  • 基于Pyqt5+serial的串口电池监测工具

    本章,其他的没有,废话没有,介绍一下新开源了一个公司的测试工具,写了差不多三周吧。先来看看界面: 这是一个串口调试界面,使用Pyqt5+serial完成。升级功能暂未移入,占一个坑位。 基于serial二次开发的功能各位如有需要可以照搬走,这是一个纯手写的轮子,稳定!

    2024年02月14日
    浏览(41)
  • PyQt5简单读取&显示图片的应用

    前言 本文为PyQt5入门教程,具体为以下四步骤 一、程序界面简单设计 二、通过下拉列表框读取读取指定路径的图片 三、通过读取到的图片显示在界面上 四、退出事件 最终效果如下:     程序初始构成如下 在 init_ui内开始界面布局(注:分辨率为1920 × 1080)  结果应为  注

    2024年02月02日
    浏览(41)
  • PyQt5学习笔记--摄像头实时视频展示、多线程处理、视频编解码

    目录 1--前言 2--基于Qt Designer设计ui文件 3--视频的编解码操作 4--完整代码 5--结果展示 6--存在的问题 7--参考 ① 创建两个线程, 主线程 为ui线程, 子线程 用于读取摄像头视频,将处理后的图像帧数据(处理操作可以人为添加)返回到主线程进行可视化; ② 子线程向主线程传

    2023年04月09日
    浏览(49)
  • PyQt5按下按键选择文件并显示路径

    一、可直接运行代码 二、函数解释 fileName是文件的绝对路径,fileType是文件类型 第一个参数parent,用于指定父组件,一般是一个窗口,在这个窗口建立选择文件的对话框。这里是None。 第二个参数caption,定义这个选择文件的对话框的标题。 第三个参数dir,是对话框显示时默认

    2024年02月11日
    浏览(43)
  • PyQt5 视频播放--在QVideoWidget上显示视频

    1、功能概述 (1)QMediaPlayer不仅可以播放音频文件,还可以播放wmv、avi等视频文件。 2、主要函数 (1)setMedia(QMediaContent):指定一个媒体资源; (2)setPlaylist():指定一个播放列表; (3)setVideoOutput(QVideoWidget):指定一个界面组件用于视频显示; 重构参数: setVideoOutput(self

    2024年02月01日
    浏览(42)
  • PyQt5组件之QLabel显示图像和视频

    目录 一、显示图像和视频 1、显示图像  2、显示视频 二、QtDesigner 窗口简单介绍 三、相关函数 1、打开本地图片 2、保存图片到本地 3、打开文件夹 4、打开本地文本文件并显示 5、保存文本到本地 6、关联函数 7、图片 “.png” | “.jpn” Label 自适应显示 8、QLabel常用方法 1、显

    2024年02月13日
    浏览(41)
  • 【pyqt5界面化工具开发-11】界面化显示检测信息

    目录 0x00 前言: 一、布局的设置 二、消息的显示 我们在10讲的基础上,需要将其输出到界面上 思路: 1、消息的传递 2、布局的设置 先考虑好消息的传递,再来完善布局 其实先完善布局,再来设置消息的传递也行 (我不是中国人,就是外国人) 将布局设置好以后,我们就

    2024年02月10日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包