关键词:
前言
上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值。这篇文章主要是介绍Qt上位机如何实现波形的显示,串口数据的解析,以及一些小细节实现。这篇文章写完,uFUN心率计这个小项目就算结束了,最近又做了个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文件添加串口支持:
QT += serialport
头文件包含:
#include <QSerialPort>
#include <QSerialPortInfo>
串口对象的定义:
QSerialPort serial;
启动自动搜索本机串口并添加到下拉框:
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
ui->cbb_com->addItem(info.portName()); //串口号下拉菜单,增加一个条目,为串口号COM4
qDebug() << "串口搜索完成";
串口的打开:
serial.setPortName(ui->cbb_com->currentText()); //设置串口号、
serial.setBaudRate(ui->cbb_baud->currentText().toInt()); //设置波特率
serial.setDataBits(QSerialPort::Data8); //设置串口数据位8
serial.setParity(QSerialPort::NoParity); //无校验位
serial.setStopBits(QSerialPort::OneStop); //1位停止位
serial.setFlowControl(QSerialPort::NoFlowControl);
if(!serial.open(QIODevice::ReadWrite))
QMessageBox::critical(NULL, "提示", "串口打开失败");
return;
串口的关闭:
serial.close();
关联信号与槽函数:
connect(&serial, & QSerialPort::readyRead, this, &Pulse::serialPort_readyRead);
串口通讯协议:
电压值的显示:S+传感器数值+
心率值的显示:B+心率值+
槽函数里进行串口数据的解析:
//串口数据接收并解析
void Pulse::serialPort_readyRead()
bool ok1, ok2;
static double x;
double SensorValue;
QByteArray rx_buf= serial.readAll();;
int len = rx_buf.length();
// qDebug() << rx_buf << " - " << len;
x += 0.1;
if(rx_buf.startsWith("S") && rx_buf.endsWith("
"))
int indx1 = rx_buf.indexOf("
");
QString str1 = rx_buf.mid(1, indx1 - 1);
SensorValue = str1.toDouble(&ok1) * 3.3 / 4096 ;
if(ok1 && !stopFlag)
if(SensorValue > 2.5)
SensorValue = 2.5;
if(SensorValue < 1.4)
SensorValue = 1.4;
// qDebug() << " 电压值: "<< SensorValue;
QString dis_SIG;
dis_SIG.sprintf("%.2f v", SensorValue);
ui->lbe_SIG->setText(dis_SIG);
ui->widget->graph(0)->addData(x, SensorValue);
ui->widget->xAxis->setRange(x, 40, Qt::AlignRight);
ui->widget->replot();
// ui->widget->replot(QCustomPlot::rpQueuedReplot);
else if(rx_buf.startsWith("B") && rx_buf.endsWith("
"))
int index2 = rx_buf.indexOf("
");
QString str2 = rx_buf.mid(1, index2 - 1);
BMP = str2.toInt(&ok2);
qDebug() << "心率值: "<< str2;
if(ok2 && !stopFlag)
QString dis_BPM;
ui->lbe_BPM->setText(QString::number(BMP,10) + "/min");
else
x = 0;
serial.close(); //关闭串口
this->ui->btn_uart_Ctrl->setText("打开串口");
QMessageBox::warning(this, "警告", "串口数据格式错误!");
rx_buf.clear();
关于串口的详细使用,可以参考最开始学习Qt时做的一个练手项目:Qt小项目之串口助手控制LED
QCustomplot绘图库的使用
1.添加库文件到工程
库文件的下载:QCustomPlot-source.tar.gz
或者到官方网站下载最新版的库文件:qcustomplot
主要就两个文件qcustomplot.h
和qcustomplot.cpp
,把两个文件添加到Qt工程
2.pro文件添加
qcustomplot包含了一些打印的功能,所以需要包含打印的支持
QT += printsupport
3.UI界面添加Widget绘图窗口
UI界面添加Widget绘图窗口,并右键把它提升为QCustomPlot类,Qt提升控件时,通常提升的类名称中,每个单词的首字母必须大写,否则无法识别,如这里必须写成QCustomPlot而不能写成Qcustomplot或qcustomplot
4.Widget的初始化:
ui->widget->setBackground(QBrush(Qt::white)); //设置背景颜色
ui->widget->axisRect()->setupFullAxesBox();//在坐标轴右侧和上方画线,和X/Y轴一起形成一个矩形
ui->widget->legend->setFont(QFont("Helvetica", 12)); //设置图例字体和大小
ui->widget->legend->setVisible(true); //使能图例可见
ui->widget->xAxis->setLabel("时间"); //设置X轴文字标注
ui->widget->yAxis->setLabel("电压值");//设置Y轴文字标注
ui->widget->yAxis->setRangeLower(1);
ui->widget->yAxis->setRangeUpper(3);
// ui->widget->yAxis->setRangeLower(-2); //设置y轴最小值
// ui->widget->yAxis->setRangeUpper(3); //设置y轴最大值
// ui->widget->graph(0)->setLineStyle(QCPGraph::lsLine);
// ui->widget->graph(0)->setPen(QPen(Qt::blue));
ui->widget->addGraph();
QPen pen(Qt::red, 1.5, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);
ui->widget->graph(0)->setPen(pen);
ui->widget->graph(0)->setName("心跳曲线");
5.实时显示串口发来的电压值
在串口接收的槽函数中实现:
ui->widget->graph(0)->addData(x, SensorValue);
ui->widget->xAxis->setRange(x, 40, Qt::AlignRight);
ui->widget->replot();
QCustomplot是Qt开发环境下一个很强大而又简单的绘图库,关于QCustomplot库的详细使用方法,可以参考这篇文章:Qt-QCustomplot画静态、动态曲线教程图解
软件自动更新功能的实现
这个上位机包含了一个检测更新的小功能,如果有新版本,点击检查更新会弹出如下窗口,如果点击去下载,会直接跳转到浏览器,创建下载任务。
详细的实现思路和过程,可以看我写的笔记:Qt实现软件自动更新的一种简单方法
软件的下载
有需要这个上位机软件的朋友,可以直接下载:uFun_Pulse_v1.1.exe
总结
这两周利用周末的时间,把uFUN开发板+传感器实现心率计这个小项目的实现过程写完了,整体来看,写的不是很详细,但具体的实现思路介绍的还算清晰,希望能对大家有一些帮助。上位机目前还有一些小BUG待解决,等有点时间,再继续完善。
uFUN评测系列文章
- 基于uFUN开发板的心率计(一)DMA方式获取传感器数据
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
- Qt实现软件自动更新的一种简单方法
- 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
- 如何使用串口来给STM32下载程序
- STM32串口打印输出乱码的解决办法
- Keil报错:cannot open source input file "core_cmInstr.h" 解决办法
欢迎大家关注我的个人博客:www.wangchaochao.top
或微信扫码关注我的公众号
基于stm32设计的健康检测设备(测温心率计步)(代码片段)
1.项目介绍本文介绍的项目是基于STM32设计的健康检测设备,支持体温测量,心率检测,支持运动计步(采用MPU6050陀螺仪实现),支持WIFI传输数据到手机APP打印显示。硬件环境介绍:MCU采用STM32F103C8T6心率传感器采用PulseSenso... 查看详情
stm32视频教程分享:心率检测仪的设计与实现
STM32系列是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。本项目主要讲述了通过心律传感器采集我们的心律数据,然后通过串口传送到上位机中,上位机用Qt实现,当Qt接收数据之后,把数据绘制... 查看详情
开源应用qt—tcp网络上位机的设计(代码片段)
本文设计一个终端控制的上位机软件(如“设计目标”下图所示),可以和STM32、Adruino等通信实现无线局域网控制系统。本文的通信内容和图表内容可以参考作者之前的文章STM32+ESP8266连接电脑Qt网络上位机——QT篇... 查看详情
匿名上位机的使用(51版)(代码片段)
...很多时间再次学习,今天就记录下来。要想实现单片机与上位机的通信,就要按照上位机给定的数据格式来编写传输数据的格式。其实质就是串口发送数据包的格式。在上位机的界面上就能找到数据格式的说明:这是我使用的版... 查看详情
基于can总线的汽车诊断协议uds(上位机开发驱动篇)
本篇作为UDS上位机的驱动开发篇,从市面上多见的CAN分析仪着手介绍UDS上位机驱动开发和移植的一般过程,目的是使UDS上位机软件能适应多家CAN分析仪,降低使用者的硬件成本。一:广成CAN分析仪的驱动开发首先创建ECANDLL类,... 查看详情
usb应用实战视频教程第4期:手把手玩转基于qt6.4的usbbulk上位机和下位机开发下篇(2022-11-07)
....php?mod=viewthread&tid=110519本期视频教程为大家展示基于QT6.4的USBBULK上位机开发视频教程,上期视频教程分享了下位机开发。首次制作QT6.4的USB上位机,踩了好多坑,在视频里面都给大家做了分享。视频ÿ 查看详情
基于鸿联标准系统开发板的毛泽东诗文应用(代码片段)
为了满足基于鸿蒙标准系统的物联网应用需求,鸿联关公200开发板刚完成OpenHarmony3.2及master版本的适配。开发板采用了瑞芯微RK3568芯片,具有常见音视频接口,集成高性能LTECat.1模块,专注物联网应用的开发。适逢毛泽东诞辰129... 查看详情
基于openharmony开发板的环境搭建及烧录过程(拓维niobe开发板)(代码片段)
前言 此次基于OpenHarmony开发板的环境搭建及烧录过程(拓维Niobe开发板)是在参加OpenHarmony开源开发者成长计划的活动中进行学习和探索的一个过程。 由于环境搭建所涉及的领域及组件会比较多,所以我在搭建环境的时... 查看详情
一个简单的基于mini2440开发板的启动代码
1.S3C2440大概的启动流程(NAND启动):①设置CPU为SVC模式②关闭看门狗③屏蔽中断④关闭MMU⑤初始化时钟⑥初始化内存(SDRAM)⑦初始化栈指针(SP,R13)⑧初始化NANDFlash⑨拷贝代码从NAND到内存⑩清除BSS段最后,跳转至C语言的Main函... 查看详情
qt上位机开发之如何让自己的app启动与硬件信息绑定(win端)
在工作中,为了方便项目调试,一般情况下我们都会选择开发一个上位机来实现简单的控制和数据读取的功能;但是,这个工具仅限于研发人员使用。为了防止别有用心的测试或者其它人员将这个APP通过U盘的形式拷贝走然后到... 查看详情
嵌入式stm32项目开发心率检测仪的设计与实现
本课程主要基于心率检测仪的设计与实现讲解STM32开发技术,STM32开发板广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理、机器人及过程控制等领域,完成数据监控、数据处理、数据传递等功能。... 查看详情
c#上位机开发(十七)——基于nuget安装并使用包(visualstudio)(代码片段)
一、NuGet微软官方文档:https://docs.microsoft.com/zh-cn/nuget/。NuGet是适用于.NET的包管理器。它使开发人员能够创建、共享和使用有用的.NET库。NuGet客户端工具可生成这些库并将其作为“包”。二、添加Newtonsoft.JsonNuget包1.创建项目... 查看详情
qt实现软件自动更新的一种简单方法(代码片段)
前言最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种简单的方式来实现。实现效果如下:点击“检查更新”按钮,如果当前版本低于... 查看详情
基于robomasterc型开发板的rt-thread使用分享
...接开始我们的实践部分。创建工程在上篇文章中我是使用基于芯片创建的,我原本想着不通过BSP文件在教程中教大家一步一步的通过Kconfig+CubeMX配置出可以驱动整个开发板所有外设的工程的。在社区前辈的提醒后才知道通... 查看详情
fpga课设-基于xilinxbasys2开发板的除法器设计
介绍一下Basys开发板:Basys2FPGA开发板是一个电路设计实现平台,任何人都可以通过它来搭建一个真正的数字电路。Basys2是围绕着一个Spartan-3EFPGA芯片和一个AtmelAT90USBUSB控制器搭建的,它提供了完整、随时可以使用的硬件平台,并... 查看详情
qt上位机开发之如何让自己的app启动与硬件信息绑定(win端)
在工作中,为了方便项目调试,一般情况下我们都会选择开发一个上位机来实现简单的控制和数据读取的功能;但是,这个工具仅限于研发人员使用。为了防止别有用心的测试或者其它人员将这个APP通过U盘的形式拷贝走然后到... 查看详情
qt上位机开发之如何让自己的app启动与硬件信息绑定(win端)
在工作中,为了方便项目调试,一般情况下我们都会选择开发一个上位机来实现简单的控制和数据读取的功能;但是,这个工具仅限于研发人员使用。为了防止别有用心的测试或者其它人员将这个APP通过U盘的形式拷贝走然后到... 查看详情
nrf52832学习笔记蓝牙从机proflies开发(代码片段)
nrf52832学习笔记(八)蓝牙从机Proflies开发所谓开发蓝牙应用程序,其实就是开发service和characteristic。通过API,添加自己需要的characteristic和service,你自己的蓝牙设备就诞生了。只要characteristic和service是符合GATT... 查看详情