Qt 实现脉搏检测-2,简陋的功能产品
今天终于可以接上硬件来显示真是的脉搏情况了,上图
主要就是显示脉搏的心跳曲线,和IBI
数据来源是三个,串口,网口和蓝牙,目前只实现了串口,过程应该都是差不多的,监听,读取,解析,等硬件更新后,再次更新代码
下面说说代买部分
#include "get_date.h"
#include <windows.h>
#include <QDebug>
#include <QTimer>
#include <QSerialPort>
#include <QDebug>
static int flag_get =0;
QTimer timer;
QSerialPort port;
QSerialPort serialport;
static int serialport_date = 0;
static int bmp = 200;
static int ibi = 0;
Get_date::Get_date()
{
qDebug()<<"Qthread is run"; serialport.setPortName("COM4");
serialport.open(QIODevice::ReadWrite);
serialport.setBaudRate(115200);
serialport.setDataBits(QSerialPort::Data8);
serialport.setParity(QSerialPort::NoParity);
serialport.setStopBits(QSerialPort::OneStop);
serialport.setFlowControl(QSerialPort::NoFlowControl);
connect(&serialport,SIGNAL(readyRead()),this,SLOT(read_serialport())); } void Get_date::run()
{
connect(&timer,SIGNAL(timeout()),this,SLOT(timerout()));
timer.start(100);
} Get_date::~Get_date()
{
timer.stop();
qDebug()<<"Qthread is exit";
} void Get_date::change_get_flag(int temp)
{
flag_get = temp;
} void Get_date::timerout()
{ switch (flag_get)
{
case 0: //串口 break;
case 1: //网口
emit send_date(1,rand()%300,0,0,0);
break;
case 2: //蓝牙
emit send_date(2,rand()%300,0,0,0);
break;
default:
break;
}
}
static bool q_flag = true;
void Get_date::read_serialport()
{
QByteArray temp;
temp = serialport.readAll();
// qDebug()<<bmp<<temp;
serialport_date = temp.mid(1,3).toInt();
if(temp.length()>6)
{
int temp1=0;
if((temp1 = temp.indexOf("B"))>0)
{
QByteArray temp3 = temp.mid(temp1+1);
int temp2 = temp3.indexOf("\r");
bmp = temp3.mid(0,temp2).toInt();
} if((temp1 = temp.indexOf("Q"))>0)
{
QByteArray temp3 = temp.mid(temp1+1);
int temp2 = temp3.indexOf("\r");
ibi = temp3.mid(0,temp2).toInt();
q_flag = true;
}
else
{
q_flag = false;
} }
if(flag_get == 0)
{
if(q_flag)
{
emit send_date(0,serialport_date,bmp,ibi,1); }
else
{
emit send_date(0,serialport_date,bmp,ibi,0);
}
} }
这部分目前只要就是从串口读取数据,但是现在有一个问题就是,每次串口的端口不是固定的,还没有找到好的方法来检测,等正式开发的时候可以检测id,现在目前只能是每次看一下,完了该一下代码中的端口号码。
还有一个问题不知道大家有没有遇到过,就是在默认窗口大小的时候,串口接受数据都是正常的,但是当我把窗口最大话的时候,串口接收的数据就会出现错误,
所以我代码里面用了关键字检索,而没有用格式化截取。
#include "palmus.h"
#include "ui_palmus.h"
#include <QDebug>
#include <list>
#include <windows.h>
#include <QtMath>
#include <QMovie>
#include <QTimer>
using namespace std;
typedef list<int> LISTINT;
static LISTINT listdate;
static LISTINT::iterator i,j;
static LISTINT ibidate;
static LISTINT::iterator k,l;
QMovie* movie;
static int bmp = 599;
Palmus::Palmus(QWidget *parent) :QWidget(parent),
ui(new Ui::Palmus)
{
ui->setupUi(this);
this->setWindowTitle("Palmus");
ui->label_palmus->setStyleSheet("background-color: rgb(0, 0, 0)");
ui->label_palmus->installEventFilter(this);
ui->label_ibi->installEventFilter(this);
connect(&Demodate,SIGNAL(send_date(int,int,int,int,int)),this,SLOT(slot_get_date(int,int,int,int,int)));
connect(this,SIGNAL(get_date_flag(int)),&Demodate,SLOT(change_get_flag(int)));
movie = new QMovie("D:/WorkSpace/Palmus/source/heart_gif_2.gif");
ui->label_heart->setMovie(movie);
movie->start();
Demodate.run();
ui->label_blue->hide();
ui->label_blue_date->hide();
ui->label_internet->hide();
ui->label_internet_date->hide();
ui->label_serial->hide();
ui->label_serial_date->hide();
} Palmus::~Palmus()
{
movie->stop();
Demodate.exit(1);
delete ui;
}
static bool serial_flag = true;
static bool interent_flag = true;
static bool blue_flag = true;
void Palmus::slot_get_date(int temp1, int temp2, int temp3, int temp4, int temp5)
{
switch (temp1) {
case 0:
{
ui->label_blue->hide();
ui->label_blue_date->hide();
ui->label_internet->hide();
ui->label_internet_date->hide();
ui->label_serial->show();
if(serial_flag)
{
ui->label_serial_date->show();
serial_flag = false;
}
else
{
ui->label_serial_date->hide();
serial_flag = true;
}
listdate.push_front(0-(temp2-512));
bmp = temp3;
if(temp5 ==1)
{
ibidate.push_front(temp4); }
update();
if(listdate.size()>999)
{
listdate.pop_back();
}
if(ibidate.size()>999)
{
ibidate.pop_back();
}
break;
}
case 1:
{
ui->label_blue->hide();
ui->label_blue_date->hide();
ui->label_internet->show();
ui->label_serial->hide();
ui->label_serial_date->hide();
if(interent_flag)
{
ui->label_internet_date->show();
interent_flag = false;
}
else
{
ui->label_internet_date->hide();
interent_flag = true;
}
listdate.push_front(temp2);
update();
if(listdate.size()>999)
{
listdate.pop_back();
}
break;
}
case 2:
{
ui->label_blue->show();
ui->label_internet->hide();
ui->label_internet_date->hide();
ui->label_serial->hide();
ui->label_serial_date->hide();
if(blue_flag)
{
ui->label_blue_date->show();
blue_flag = false;
}
else
{
ui->label_blue_date->hide();
blue_flag = true;
}
listdate.push_front(temp2);
update();
if(listdate.size()>999)
{
listdate.pop_back();
}
break;
}
default:
break;
}
} bool Palmus::eventFilter(QObject *object1, QEvent *event1)
{
if(object1 == ui->label_palmus&&event1->type()==QEvent::Paint)
{
draw_palmus();
}
if(object1 == ui->label_ibi&&event1->type()==QEvent::Paint)
{
draw_ibi();
}
return true;
} static int temp1;
static int temp2;
void Palmus::draw_palmus()
{
//Draw scale
QPainter painter_scale(ui->label_palmus);
painter_scale.setBrush(Qt::black);
painter_scale.drawRect(0,0,ui->label_palmus->width(),ui->label_palmus->height());
painter_scale.setPen(QPen(Qt::green,0.5));
painter_scale.setRenderHints(QPainter::Antialiasing,true);
int scale_x = ui->label_palmus->width();
int scale_y = ui->label_palmus->height();
painter_scale.drawLine(0,0,0,scale_y);
painter_scale.drawLine(0,scale_y,scale_x,scale_y);
while (scale_y>0)
{
painter_scale.drawLine(0,scale_y,ui->label_palmus->width(),scale_y);
scale_y = scale_y-20;
}
scale_x = 0;
scale_y = ui->label_palmus->height();
while (scale_x<(ui->label_palmus->width()))
{
painter_scale.drawLine(scale_x,scale_y,scale_x,0);
scale_x= scale_x+20;
}
//Draw palmus
QPainter painter(ui->label_palmus);
painter.setRenderHints(QPainter::Antialiasing,true);
painter.translate(0,(ui->label_palmus->height()/2));
painter.save();
painter.setPen(QPen(Qt::red,2));
int x = ui->label_palmus->width();
i = listdate.begin();
temp1 = *i;
for(i=listdate.begin();i!=listdate.end();i=i.operator ++(1))
{
j=i.operator ++(1);
temp2 = *j;
painter.drawLine(x,(ui->Slider_scale->value()/100.0)*(temp1/1024.0*ui->label_palmus->height()),x-3,(ui->Slider_scale->value()/100.0)*(temp2/1024.0*ui->label_palmus->height()));
temp1 = temp2;
x=x-3;
}
bmp = min(bmp,200);
ui->label_heart_rate->setText("BMP:"+QString::number(bmp,10));
painter.restore(); } void Palmus::draw_ibi()
{
QPainter painter(ui->label_ibi);
painter.setPen(QPen(Qt::red,2));
int x = ui->label_ibi->width();
k = ibidate.begin();
temp1 = *k;
float temp3 =1024.0;
for(k=ibidate.begin();k!=ibidate.end();k=k.operator ++(1))
{
l=k.operator ++(1);
temp2 = *l;
if(temp1>temp3)
{
temp3 = temp1/1.0;
}
painter.drawLine(x,(temp1/temp3*ui->label_ibi->height()),x-1,(temp2/temp3*ui->label_ibi->height()));
temp1 = temp2;
x=x-1;
}
ui->label_ibi_date->setText("IBI:"+QString::number(*ibidate.begin(),10));
} //void Palmus::draw_heart()
//{ // QPainter painter(ui->label_heart);
// double x, y, r;
// for (int i = 0; i <= 90; i++)
// {
// for (int j = 0; j <= 90; j++)
// {
// //转换为直角坐标系,设置偏移量,使图像居中
// r = M_PI / 45 * i * (1 - qSin(M_PI / 45 * j)) * 19;
// x = r * qCos(M_PI / 45 * j) * qSin(M_PI / 45 * i) + 100 / 2;
// y = -r * qSin(M_PI / 45 * j) + 100 / 4;
// painter.setBrush(Qt::red);
// painter.setPen(Qt::red);
// painter.drawPoint(x,y);
// }
// }
//} void Palmus::on_pushButton_clicked()
{
listdate.clear();
update();
emit get_date_flag(0);
} void Palmus::on_pushButton_2_clicked()
{
listdate.clear();
update();
emit get_date_flag(1);
} void Palmus::on_pushButton_3_clicked()
{
listdate.clear();
update();
emit get_date_flag(2);
}
这部分目前也没有做太多的修改,因为没有网络和蓝牙部分的代码,所以好多逻辑还是有问题,需要在正式开的时候重新梳理一下逻辑,现在也指示能够勉强实现。如果有那里有疑问可以联系我,或者有更好的解决方案可以直接找我,欢迎大神们指导,哈哈。
界面问题,以前都不怎么会用界面的布局,一般写的也都是嵌入式设备的程序,用的最多的就是全屏显示,剩下的就是绝对布局了。
这次逼着这几学习了一下布局,发现用了就会爱上它,哈哈哈
用了几个布局的,感觉用布局,那你就要提前都想的差不多了,后期在加,感觉好有困难的,也许还是自己用的不熟练,弄了好几次才勉强可以使用了,以后希望可以尝试更多的布局。
源代码连接在后期评论中加上
Qt 实现脉搏检测-2,简陋的功能产品的更多相关文章
- Qt 实现脉搏检测-1-心跳曲线部分
最新的想法就是写一个显示脉搏的东西,主要就是通过串口读取硬件(检测心跳的)传来的数据,在显示一下. 先实现画心跳曲线 如下图 先来电干货, 首先,在这个代码中,第一次用到了list这个东东 所以,关于 ...
- paip.c++ qt 图片处理 检测损坏的图片
paip.c++ qt 图片处理 检测损坏的图片 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.net ...
- 基于opencv和qt的人脸检测小系统
摘要:利用opencv读取视频.图片并检测人脸,利用QT显示窗口,功能选择等 环境:Ubuntu18.04.OpenCV3.4.0.QT5.10.1 效果图: 代码如下(比较简单没什么注释): mai ...
- QT 内存泄露 检测
一:问题出现 最近几天在做一个QT程序,IPX的检测控制程序.需要全天候运行.自己做完了,然后就运行.使用 top|grep TP2 来动态检测程序的CPU,内存占用律.不幸的是,一晚 ...
- Qt应用中检测内存泄露——VLD
本文简要描述一下在Qt应用中使用VLD来检测内存泄露.本次测试环境:QtCreator2.3 + Qt4.7.4-vs2008 + VS2008 Express. 1.下载并安装:VLD-2.2: h ...
- Qt: usb热插拔检测(windows);
Qt提供了QAbstractNativeEventFilter来实现本地时间得过滤,通过对本地事件的检测,判断usb热插拔:(这里是windows 的例子); 首先,以QWidget, QAbstra ...
- Qt中文本编辑器实现语法高亮功能(Qscitinlla)
Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...
- Qt操作xml文件(增删改功能)
这个例子是在根据网上博客<Qt数据库(XML)>改写的一个操作XML的实现. 借鉴了很多里面的代码,大家可以结合上面的博客对照,相信你肯定会对XML的操作熟练起来. 我建立的是Qwidge ...
- 一个基于QT简单登录对话框(带验证码功能)
1. 对话框样式 2. 源代码 ①. main.cpp #include <QtGui/QApplication> #include "QLoginDialog.h" ...
随机推荐
- 负的CPU保护环
什么是CPU保护环? 在计算机科学中, 分级保护域(英语:hierarchical protection domains),经常被叫作保护环(Protection Rings),又称环型保护(Ring ...
- 如何为WebStorm设置SASS的File Watchers?
Webstorm是一个很牛叉的IDE,现在工作每天都是用它了. 最近开始用SASS,LESS等来写CSS,而在Webstorm中,它自带一个File Watchers功能,设置一下,即可实时编译SAS ...
- Webpack2入门
webpack 2 将在其文档完成之后正式发布.但这并不意味着不可以开始使用它,如果你知道怎么配置的话. 什么是 Webpack? 简单来说,Webpack 就是一个针对 JavaScript 代码的 ...
- 【办公-Word-VB】人民币大写转换-带完整注释
完整代码见:我的CSDN博客 -------------------- 应公司财务人员的请求,需在Word中做个:输入阿拉伯数字,自动转换成大写,并填充到Word控件中对应的亿.万.千控件格子的功能, ...
- c语言描述的数据结构的注意细节
:顺序表使用基址来表示和存储 int *p; p=(int *)malloc(initsize*sizeof(int)); L—>p[x]=xx; :链表 在于除了更改数据还要更改前后与之关联的 ...
- html基础用法(下)
设计表格: <html> <head> <title>表格</title> <meta charset="utf-8" /&g ...
- Openresty最佳案例 | 汇总
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616856 本文出自方志朋的博客 目录 Openresty最佳案例 | 第1篇:Ngin ...
- he lover you 用python 搞为 eh revol uoy 。
1.字符串序列翻转 ---- 字符串切片 a_str = “abc”[::-1] 2.字符串分割: b_str = ‘ ds fdf ds ’ b_str .split(" 空格& ...
- 使用 seafile搭建私有云盘
一.系统环境 系统:CentOS7-1708IP地址:192.168.159.33 二.安装seafile [root@seafile ~]# yum -y install epel-release[ ...
- Unity3D usage Experience
I have been using Unity3D to make game for half one year. I began to lean Unity3D with some books, o ...