基于STM32的心率计(3):Qt上位机设计

原创 电子电路开发学习 2024-06-25 21:13

。前言

前两篇文章介绍了AD采集传感器数据和数据的滤波处理获取心率值。这篇文章主要是介绍Qt上位机如何实现波形的显示,串口数据的解析,以及一些小细节实现。这篇文章写完,uFUN心率计这个小项目就算结束了。

关于Qt

Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。——来自百度百科

串口数据的解析和显示

pro文件添加串口支持:

  1. QT += serialport

头文件包含:

  1. #include <QSerialPort>

  2. #include <QSerialPortInfo>

串口对象的定义:

  1. QSerialPort serial;

启动自动搜索本机串口并添加到下拉框:

  1. foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

  2. {

  3. ui->cbb_com->addItem(info.portName()); //串口号下拉菜单,增加一个条目,为串口号COM4

  4. qDebug() << "串口搜索完成";

  5. }

串口的打开:

  1. serial.setPortName(ui->cbb_com->currentText()); //设置串口号、

  2. serial.setBaudRate(ui->cbb_baud->currentText().toInt()); //设置波特率

  3. serial.setDataBits(QSerialPort::Data8); //设置串口数据位8

  4. serial.setParity(QSerialPort::NoParity); //无校验位

  5. serial.setStopBits(QSerialPort::OneStop); //1位停止位

  6. serial.setFlowControl(QSerialPort::NoFlowControl);

  7. if(!serial.open(QIODevice::ReadWrite))

  8. {

  9. QMessageBox::critical(NULL, "提示", "串口打开失败");

  10. return;

  11. }

串口的关闭:

  1. serial.close();

关联信号与槽函数:

  1. connect(&serial, & QSerialPort::readyRead, this, &Pulse::serialPort_readyRead);

串口通讯协议:

  1. 电压值的显示:S+传感器数值+\r\n

  2. 心率值的显示:B+心率值+\r\n

槽函数里进行串口数据的解析:

  1. //串口数据接收并解析

  2. void Pulse::serialPort_readyRead()

  3. {

  4. bool ok1, ok2;

  5. static double x;

  6. double SensorValue;

  7. QByteArray rx_buf= serial.readAll();;

  8. int len = rx_buf.length();

  9. // qDebug() << rx_buf << " - " << len;

  10. x += 0.1;

  11. if(rx_buf.startsWith("S") && rx_buf.endsWith("\r\n"))

  12. {

  13. int indx1 = rx_buf.indexOf("\r\n");

  14. QString str1 = rx_buf.mid(1, indx1 - 1);

  15. SensorValue = str1.toDouble(&ok1) * 3.3 / 4096 ;

  16. if(ok1 && !stopFlag)

  17. {

  18. if(SensorValue > 2.5)

  19. SensorValue = 2.5;

  20. if(SensorValue < 1.4)

  21. SensorValue = 1.4;

  22. // qDebug() << " 电压值: "<< SensorValue;

  23. QString dis_SIG;

  24. dis_SIG.sprintf("%.2f v", SensorValue);

  25. ui->lbe_SIG->setText(dis_SIG);

  26. ui->widget->graph(0)->addData(x, SensorValue);

  27. ui->widget->xAxis->setRange(x, 40, Qt::AlignRight);

  28. ui->widget->replot();

  29. // ui->widget->replot(QCustomPlot::rpQueuedReplot);

  30. }

  31. }

  32. else if(rx_buf.startsWith("B") && rx_buf.endsWith("\r\n"))

  33. {

  34. int index2 = rx_buf.indexOf("\r\n");

  35. QString str2 = rx_buf.mid(1, index2 - 1);

  36. BMP = str2.toInt(&ok2);

  37. qDebug() << "心率值: "<< str2;

  38. if(ok2 && !stopFlag)

  39. {

  40. QString dis_BPM;

  41. ui->lbe_BPM->setText(QString::number(BMP,10) + "/min");

  42. }

  43. }

  44. else

  45. {

  46. x = 0;

  47. serial.close(); //关闭串口

  48. this->ui->btn_uart_Ctrl->setText("打开串口");

  49. QMessageBox::warning(this, "警告", "串口数据格式错误!");

  50. }

  51. rx_buf.clear();

  52. }

关于串口的详细使用,可以参考最开始学习Qt时做的一个练手项目:Qt小项目之串口助手控制LED

QCustomplot绘图库的使用

1.添加库文件到工程

库文件的下载:https://wcc-blog.oss-cn-beijing.aliyuncs.com/BlogFile/QCustomPlot-source.tar.gz

或者到官方网站下载最新版的库文件:https://www.qcustomplot.com/

主要就两个文件 qcustomplot.h和 qcustomplot.cpp,把两个文件添加到Qt工程

2.pro文件添加

qcustomplot包含了一些打印的功能,所以需要包含打印的支持

  1. QT += printsupport

3.UI界面添加Widget绘图窗口

UI界面添加Widget绘图窗口,并右键把它提升为QCustomPlot类,Qt提升控件时,通常提升的类名称中,每个单词的首字母必须大写,否则无法识别,如这里必须写成QCustomPlot而不能写成Qcustomplot或qcustomplot


4.Widget的初始化:

  1. ui->widget->setBackground(QBrush(Qt::white)); //设置背景颜色

  2. ui->widget->axisRect()->setupFullAxesBox();//在坐标轴右侧和上方画线,和X/Y轴一起形成一个矩形

  3. ui->widget->legend->setFont(QFont("Helvetica", 12)); //设置图例字体和大小

  4. ui->widget->legend->setVisible(true); //使能图例可见

  5. ui->widget->xAxis->setLabel("时间"); //设置X轴文字标注

  6. ui->widget->yAxis->setLabel("电压值");//设置Y轴文字标注

  7. ui->widget->yAxis->setRangeLower(1);

  8. ui->widget->yAxis->setRangeUpper(3);

  9. // ui->widget->yAxis->setRangeLower(-2); //设置y轴最小值

  10. // ui->widget->yAxis->setRangeUpper(3); //设置y轴最大值

  11. // ui->widget->graph(0)->setLineStyle(QCPGraph::lsLine);

  12. // ui->widget->graph(0)->setPen(QPen(Qt::blue));

  13. ui->widget->addGraph();

  14. QPen pen(Qt::red, 1.5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);

  15. ui->widget->graph(0)->setPen(pen);

  16. ui->widget->graph(0)->setName("心跳曲线");

5.实时显示串口发来的电压值

在串口接收的槽函数中实现:

  1. ui->widget->graph(0)->addData(x, SensorValue);

  2. ui->widget->xAxis->setRange(x, 40, Qt::AlignRight);

  3. ui->widget->replot();

QCustomplot是Qt开发环境下一个很强大而又简单的绘图库,关于QCustomplot库的详细使用方法,可以参考这篇文章:https://blog.csdn.net/qq_40194498/article/details/79666903

软件自动更新功能的实现

这个上位机包含了一个检测更新的小功能,如果有新版本,点击检查更新会弹出如下窗口,如果点击去下载,会直接跳转到浏览器,创建下载任务。

详细的实现思路和过程,可以看我写的笔记:Qt实现软件自动更新的一种简单方法

软件的下载

有需要这个上位机软件的朋友,可以直接下载:https://wcc-blog.oss-cn-beijing.aliyuncs.com/QtUpdate/uFun_Pulse_v1.1.exe

总结

这两周利用周末的时间,把uFUN开发板+传感器实现心率计这个小项目的实现过程写完了,整体来看,写的不是很详细,但具体的实现思路介绍的还算清晰,希望能对大家有一些帮助。上位机目前还有一些小BUG待解决,等有点时间,再继续完善。

电子电路开发学习 单片机点灯小能手,电子行业从业者。开发板评测、嵌入式开源项目分享、学习笔记记录。可能不会经常更新,但每一篇都是精心编写。
评论
  • 最近几年,新能源汽车愈发受到消费者的青睐,其销量也是一路走高。据中汽协公布的数据显示,2024年10月,新能源汽车产销分别完成146.3万辆和143万辆,同比分别增长48%和49.6%。而结合各家新能源车企所公布的销量数据来看,比亚迪再度夺得了销冠宝座,其10月新能源汽车销量达到了502657辆,同比增长66.53%。众所周知,比亚迪是新能源汽车领域的重要参与者,其一举一动向来为外界所关注。日前,比亚迪汽车旗下品牌方程豹汽车推出了新车方程豹豹8,该款车型一上市就迅速吸引了消费者的目光,成为SUV
    刘旷 2024-12-02 09:32 58浏览
  • 在电子技术快速发展的今天,KLV15002光耦固态继电器以高性能和强可靠性完美解决行业需求。该光继电器旨在提供无与伦比的电气隔离和无缝切换,是现代系统的终极选择。无论是在电信、工业自动化还是测试环境中,KLV15002光耦合器固态继电器都完美融合了效率和耐用性,可满足当今苛刻的应用需求。为什么选择KLV15002光耦合器固态继电器?不妥协的电压隔离从本质上讲,KLV15002优先考虑安全性。输入到输出隔离达到3750Vrms(后缀为V的型号为5000Vrms),确保即使在高压情况下,敏感的低功耗
    克里雅半导体科技 2024-11-29 16:15 119浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-30 14:30 62浏览
  • 《高速PCB设计经验规则应用实践》+PCB绘制学习与验证读书首先看目录,我感兴趣的是这一节;作者在书中列举了一条经典规则,然后进行详细分析,通过公式推导图表列举说明了传统的这一规则是受到电容加工特点影响的,在使用了MLCC陶瓷电容后这一条规则已经不再实用了。图书还列举了高速PCB设计需要的专业工具和仿真软件,当然由于篇幅所限,只是介绍了一点点设计步骤;我最感兴趣的部分还是元件布局的经验规则,在这里列举如下:在这里,演示一下,我根据书本知识进行电机驱动的布局:这也算知行合一吧。对于布局书中有一句:
    wuyu2009 2024-11-30 20:30 84浏览
  • 国产光耦合器正以其创新性和多样性引领行业发展。凭借强大的研发能力,国内制造商推出了适应汽车、电信等领域独特需求的专业化光耦合器,为各行业的技术进步提供了重要支持。本文将重点探讨国产光耦合器的技术创新与产品多样性,以及它们在推动产业升级中的重要作用。国产光耦合器创新的作用满足现代需求的创新模式新设计正在满足不断变化的市场需求。例如,高速光耦合器满足了电信和数据处理系统中快速信号传输的需求。同时,栅极驱动光耦合器支持电动汽车(EV)和工业电机驱动器等大功率应用中的精确高效控制。先进材料和设计将碳化硅
    克里雅半导体科技 2024-11-29 16:18 157浏览
  • 光伏逆变器是一种高效的能量转换设备,它能够将光伏太阳能板(PV)产生的不稳定的直流电压转换成与市电频率同步的交流电。这种转换后的电能不仅可以回馈至商用输电网络,还能供独立电网系统使用。光伏逆变器在商业光伏储能电站和家庭独立储能系统等应用领域中得到了广泛的应用。光耦合器,以其高速信号传输、出色的共模抑制比以及单向信号传输和光电隔离的特性,在光伏逆变器中扮演着至关重要的角色。它确保了系统的安全隔离、干扰的有效隔离以及通信信号的精准传输。光耦合器的使用不仅提高了系统的稳定性和安全性,而且由于其低功耗的
    晶台光耦 2024-12-02 10:40 53浏览
  • 艾迈斯欧司朗全新“样片申请”小程序,逾160种LED、传感器、多芯片组合等产品样片一触即达。轻松3步完成申请,境内免费包邮到家!本期热荐性能显著提升的OSLON® Optimal,GF CSSRML.24ams OSRAM 基于最新芯片技术推出全新LED产品OSLON® Optimal系列,实现了显著的性能升级。该系列提供五种不同颜色的光源选项,包括Hyper Red(660 nm,PDN)、Red(640 nm)、Deep Blue(450 nm,PDN)、Far Red(730 nm)及Ho
    艾迈斯欧司朗 2024-11-29 16:55 152浏览
  • 光耦合器作为关键技术组件,在确保安全性、可靠性和效率方面发挥着不可或缺的作用。无论是混合动力和电动汽车(HEV),还是军事和航空航天系统,它们都以卓越的性能支持高要求的应用环境,成为现代复杂系统中的隐形功臣。在迈向更环保技术和先进系统的过程中,光耦合器的重要性愈加凸显。1.混合动力和电动汽车中的光耦合器电池管理:保护动力源在电动汽车中,电池管理系统(BMS)是最佳充电、放电和性能监控背后的大脑。光耦合器在这里充当守门人,将高压电池组与敏感的低压电路隔离开来。这不仅可以防止潜在的损坏,还可以提高乘
    腾恩科技-彭工 2024-11-29 16:12 117浏览
  • RDDI-DAP错误通常与调试接口相关,特别是在使用CMSIS-DAP协议进行嵌入式系统开发时。以下是一些可能的原因和解决方法: 1. 硬件连接问题:     检查调试器(如ST-Link)与目标板之间的连接是否牢固。     确保所有必要的引脚都已正确连接,没有松动或短路。 2. 电源问题:     确保目标板和调试器都有足够的电源供应。     检查电源电压是否符合目标板的规格要求。 3. 固件问题: &n
    丙丁先生 2024-12-01 17:37 57浏览
  • 国产光耦合器因其在电子系统中的重要作用而受到认可,可提供可靠的电气隔离并保护敏感电路免受高压干扰。然而,随着行业向5G和高频数据传输等高速应用迈进,对其性能和寿命的担忧已成为焦点。本文深入探讨了国产光耦合器在高频环境中面临的挑战,并探索了克服这些限制的创新方法。高频性能:一个持续关注的问题信号传输中的挑战国产光耦合器传统上利用LED和光电晶体管进行信号隔离。虽然这些组件对于标准应用有效,但在高频下面临挑战。随着工作频率的增加,信号延迟和数据保真度降低很常见,限制了它们在电信和高速计算等领域的有效
    腾恩科技-彭工 2024-11-29 16:11 106浏览
  • By Toradex胡珊逢简介嵌入式领域的部分应用对安全、可靠、实时性有切实的需求,在诸多实现该需求的方案中,QNX 是经行业验证的选择。在 QNX SDP 8.0 上 BlackBerry 推出了 QNX Everywhere 项目,个人用户可以出于非商业目的免费使用 QNX 操作系统。得益于 Toradex 和 QNX 的良好合作伙伴关系,用户能够在 Apalis iMX8QM 和 Verdin iMX8MP 模块上轻松测试和评估 QNX 8 系统。下面将基于 Apalis iMX8QM 介
    hai.qin_651820742 2024-11-29 15:29 150浏览
  • 在现代科技浪潮中,精准定位技术已成为推动众多关键领域前进的核心力量。虹科PCAN-GPS FD 作为一款多功能可编程传感器模块,专为精确捕捉位置和方向而设计。该模块集成了先进的卫星接收器、磁场传感器、加速计和陀螺仪,能够通过 CAN/CAN FD 总线实时传输采样数据,并具备内部存储卡记录功能。本篇文章带你深入虹科PCAN-GPS FD的技术亮点、多场景应用实例,并展示其如何与PCAN-Explorer6软件结合,实现数据解析与可视化。虹科PCAN-GPS FD虹科PCAN-GPS FD的数据处
    虹科汽车智能互联 2024-11-29 14:35 147浏览
  • 戴上XR眼镜去“追龙”是种什么体验?2024年11月30日,由上海自然博物馆(上海科技馆分馆)与三湘印象联合出品、三湘印象旗下观印象艺术发展有限公司(下简称“观印象”)承制的《又见恐龙》XR嘉年华在上海自然博物馆重磅开幕。该体验项目将于12月1日正式对公众开放,持续至2025年3月30日。双向奔赴,恐龙IP撞上元宇宙不久前,上海市经济和信息化委员会等部门联合印发了《上海市超高清视听产业发展行动方案》,特别提到“支持博物馆、主题乐园等场所推动超高清视听技术应用,丰富线下文旅消费体验”。作为上海自然
    电子与消费 2024-11-30 22:03 70浏览
  • 学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&
    youyeye 2024-11-29 14:30 116浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦