基于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待解决,等有点时间,再继续完善。

电子电路开发学习 单片机点灯小能手,电子行业从业者。开发板评测、嵌入式开源项目分享、学习笔记记录。可能不会经常更新,但每一篇都是精心编写。
评论
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 109浏览
  • 百佳泰特为您整理2025年1月各大Logo的最新规格信息,本月有更新信息的logo有HDMI、Wi-Fi、Bluetooth、DisplayHDR、ClearMR、Intel EVO。HDMI®▶ 2025年1月6日,HDMI Forum, Inc. 宣布即将发布HDMI规范2.2版本。新规范将支持更高的分辨率和刷新率,并提供更多高质量选项。更快的96Gbps 带宽可满足数据密集型沉浸式和虚拟应用对传输的要求,如 AR/VR/MR、空间现实和光场显示,以及各种商业应用,如大型数字标牌、医疗成像和
    百佳泰测试实验室 2025-01-16 15:41 188浏览
  • 电竞鼠标应用环境与客户需求电竞行业近年来发展迅速,「鼠标延迟」已成为决定游戏体验与比赛结果的关键因素。从技术角度来看,传统鼠标的延迟大约为20毫秒,入门级电竞鼠标通常为5毫秒,而高阶电竞鼠标的延迟可降低至仅2毫秒。这些差异看似微小,但在竞技激烈的游戏中,尤其在对反应和速度要求极高的场景中,每一毫秒的优化都可能带来致胜的优势。电竞比赛的普及促使玩家更加渴望降低鼠标延迟以提升竞技表现。他们希望通过精确的测试,了解不同操作系统与设定对延迟的具体影响,并寻求最佳配置方案来获得竞技优势。这样的需求推动市场
    百佳泰测试实验室 2025-01-16 15:45 285浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 143浏览
  • 80,000人到访的国际大展上,艾迈斯欧司朗有哪些亮点?感未来,光无限。近日,在慕尼黑electronica 2024现场,ams OSRAM通过多款创新DEMO展示,以及数场前瞻洞察分享,全面展示自身融合传感器、发射器及集成电路技术,精准捕捉并呈现环境信息的卓越能力。同时,ams OSRAM通过展会期间与客户、用户等行业人士,以及媒体朋友的深度交流,向业界传达其以光电技术为笔、以创新为墨,书写智能未来的深度思考。electronica 2024electronica 2024构建了一个高度国际
    艾迈斯欧司朗 2025-01-16 20:45 177浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 23浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 99浏览
  • 随着消费者对汽车驾乘体验的要求不断攀升,汽车照明系统作为确保道路安全、提升驾驶体验以及实现车辆与环境交互的重要组成,日益受到业界的高度重视。近日,2024 DVN(上海)国际汽车照明研讨会圆满落幕。作为照明与传感创新的全球领导者,艾迈斯欧司朗受邀参与主题演讲,并现场展示了其多项前沿技术。本届研讨会汇聚来自全球各地400余名汽车、照明、光源及Tier 2供应商的专业人士及专家共聚一堂。在研讨会第一环节中,艾迈斯欧司朗系统解决方案工程副总裁 Joachim Reill以深厚的专业素养,主持该环节多位
    艾迈斯欧司朗 2025-01-16 20:51 137浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 69浏览
  • 日前,商务部等部门办公厅印发《手机、平板、智能手表(手环)购新补贴实施方案》明确,个人消费者购买手机、平板、智能手表(手环)3类数码产品(单件销售价格不超过6000元),可享受购新补贴。每人每类可补贴1件,每件补贴比例为减去生产、流通环节及移动运营商所有优惠后最终销售价格的15%,每件最高不超过500元。目前,京东已经做好了承接手机、平板等数码产品国补优惠的落地准备工作,未来随着各省市关于手机、平板等品类的国补开启,京东将第一时间率先上线,满足消费者的换新升级需求。为保障国补的真实有效发放,基于
    华尔街科技眼 2025-01-17 10:44 195浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦