Qt 实现脉搏检测-2,简陋的功能产品

举报
DreamLife 发表于 2022/04/15 00:47:35 2022/04/15
【摘要】 今天终于可以接上硬件来显示真是的脉搏情况了,上图   主要就是显示脉搏的心跳曲线,和IBI   数据来源是三个,串口,网口和蓝牙,目前只实现了串口,过程应该都是差不多的,监听,读取,解析,等硬件更新后,再次更新代码   下面说说代买部分     #include "...

今天终于可以接上硬件来显示真是的脉搏情况了,上图

 

主要就是显示脉搏的心跳曲线,和IBI

 

数据来源是三个,串口,网口和蓝牙,目前只实现了串口,过程应该都是差不多的,监听,读取,解析,等硬件更新后,再次更新代码

 

下面说说代买部分

 

 


  
  1. #include "get_date.h"
  2. #include <windows.h>
  3. #include <QDebug>
  4. #include <QTimer>
  5. #include <QSerialPort>
  6. #include <QDebug>
  7. static int flag_get =0;
  8. QTimer timer;
  9. QSerialPort port;
  10. QSerialPort serialport;
  11. static int serialport_date = 0;
  12. static int bmp = 200;
  13. static int ibi = 0;
  14. Get_date::Get_date()
  15. {
  16. qDebug()<<"Qthread is run";
  17. serialport.setPortName("COM4");
  18. serialport.open(QIODevice::ReadWrite);
  19. serialport.setBaudRate(115200);
  20. serialport.setDataBits(QSerialPort::Data8);
  21. serialport.setParity(QSerialPort::NoParity);
  22. serialport.setStopBits(QSerialPort::OneStop);
  23. serialport.setFlowControl(QSerialPort::NoFlowControl);
  24. connect(&serialport,SIGNAL(readyRead()),this,SLOT(read_serialport()));
  25. }
  26. void Get_date::run()
  27. {
  28. connect(&timer,SIGNAL(timeout()),this,SLOT(timerout()));
  29. timer.start(100);
  30. }
  31. Get_date::~Get_date()
  32. {
  33. timer.stop();
  34. qDebug()<<"Qthread is exit";
  35. }
  36. void Get_date::change_get_flag(int temp)
  37. {
  38. flag_get = temp;
  39. }
  40. void Get_date::timerout()
  41. {
  42. switch (flag_get)
  43. {
  44. case 0: //串口
  45. break;
  46. case 1: //网口
  47. emit send_date(1,rand()%300,0,0,0);
  48. break;
  49. case 2: //蓝牙
  50. emit send_date(2,rand()%300,0,0,0);
  51. break;
  52. default:
  53. break;
  54. }
  55. }
  56. static bool q_flag = true;
  57. void Get_date::read_serialport()
  58. {
  59. QByteArray temp;
  60. temp = serialport.readAll();
  61. // qDebug()<<bmp<<temp;
  62. serialport_date = temp.mid(1,3).toInt();
  63. if(temp.length()>6)
  64. {
  65. int temp1=0;
  66. if((temp1 = temp.indexOf("B"))>0)
  67. {
  68. QByteArray temp3 = temp.mid(temp1+1);
  69. int temp2 = temp3.indexOf("\r");
  70. bmp = temp3.mid(0,temp2).toInt();
  71. }
  72. if((temp1 = temp.indexOf("Q"))>0)
  73. {
  74. QByteArray temp3 = temp.mid(temp1+1);
  75. int temp2 = temp3.indexOf("\r");
  76. ibi = temp3.mid(0,temp2).toInt();
  77. q_flag = true;
  78. }
  79. else
  80. {
  81. q_flag = false;
  82. }
  83. }
  84. if(flag_get == 0)
  85. {
  86. if(q_flag)
  87. {
  88. emit send_date(0,serialport_date,bmp,ibi,1);
  89. }
  90. else
  91. {
  92. emit send_date(0,serialport_date,bmp,ibi,0);
  93. }
  94. }
  95. }

 

 

 

这部分目前只要就是从串口读取数据,但是现在有一个问题就是,每次串口的端口不是固定的,还没有找到好的方法来检测,等正式开发的时候可以检测id,现在目前只能是每次看一下,完了该一下代码中的端口号码。

 

还有一个问题不知道大家有没有遇到过,就是在默认窗口大小的时候,串口接受数据都是正常的,但是当我把窗口最大话的时候,串口接收的数据就会出现错误,

所以我代码里面用了关键字检索,而没有用格式化截取。

 


  
  1. #include "palmus.h"
  2. #include "ui_palmus.h"
  3. #include <QDebug>
  4. #include <list>
  5. #include <windows.h>
  6. #include <QtMath>
  7. #include <QMovie>
  8. #include <QTimer>
  9. using namespace std;
  10. typedef list<int> LISTINT;
  11. static LISTINT listdate;
  12. static LISTINT::iterator i,j;
  13. static LISTINT ibidate;
  14. static LISTINT::iterator k,l;
  15. QMovie* movie;
  16. static int bmp = 599;
  17. Palmus::Palmus(QWidget *parent) :QWidget(parent),
  18. ui(new Ui::Palmus)
  19. {
  20. ui->setupUi(this);
  21. this->setWindowTitle("Palmus");
  22. ui->label_palmus->setStyleSheet("background-color: rgb(0, 0, 0)");
  23. ui->label_palmus->installEventFilter(this);
  24. ui->label_ibi->installEventFilter(this);
  25. connect(&Demodate,SIGNAL(send_date(int,int,int,int,int)),this,SLOT(slot_get_date(int,int,int,int,int)));
  26. connect(this,SIGNAL(get_date_flag(int)),&Demodate,SLOT(change_get_flag(int)));
  27. movie = new QMovie("D:/WorkSpace/Palmus/source/heart_gif_2.gif");
  28. ui->label_heart->setMovie(movie);
  29. movie->start();
  30. Demodate.run();
  31. ui->label_blue->hide();
  32. ui->label_blue_date->hide();
  33. ui->label_internet->hide();
  34. ui->label_internet_date->hide();
  35. ui->label_serial->hide();
  36. ui->label_serial_date->hide();
  37. }
  38. Palmus::~Palmus()
  39. {
  40. movie->stop();
  41. Demodate.exit(1);
  42. delete ui;
  43. }
  44. static bool serial_flag = true;
  45. static bool interent_flag = true;
  46. static bool blue_flag = true;
  47. void Palmus::slot_get_date(int temp1, int temp2, int temp3, int temp4, int temp5)
  48. {
  49. switch (temp1) {
  50. case 0:
  51. {
  52. ui->label_blue->hide();
  53. ui->label_blue_date->hide();
  54. ui->label_internet->hide();
  55. ui->label_internet_date->hide();
  56. ui->label_serial->show();
  57. if(serial_flag)
  58. {
  59. ui->label_serial_date->show();
  60. serial_flag = false;
  61. }
  62. else
  63. {
  64. ui->label_serial_date->hide();
  65. serial_flag = true;
  66. }
  67. listdate.push_front(0-(temp2-512));
  68. bmp = temp3;
  69. if(temp5 ==1)
  70. {
  71. ibidate.push_front(temp4);
  72. }
  73. update();
  74. if(listdate.size()>999)
  75. {
  76. listdate.pop_back();
  77. }
  78. if(ibidate.size()>999)
  79. {
  80. ibidate.pop_back();
  81. }
  82. break;
  83. }
  84. case 1:
  85. {
  86. ui->label_blue->hide();
  87. ui->label_blue_date->hide();
  88. ui->label_internet->show();
  89. ui->label_serial->hide();
  90. ui->label_serial_date->hide();
  91. if(interent_flag)
  92. {
  93. ui->label_internet_date->show();
  94. interent_flag = false;
  95. }
  96. else
  97. {
  98. ui->label_internet_date->hide();
  99. interent_flag = true;
  100. }
  101. listdate.push_front(temp2);
  102. update();
  103. if(listdate.size()>999)
  104. {
  105. listdate.pop_back();
  106. }
  107. break;
  108. }
  109. case 2:
  110. {
  111. ui->label_blue->show();
  112. ui->label_internet->hide();
  113. ui->label_internet_date->hide();
  114. ui->label_serial->hide();
  115. ui->label_serial_date->hide();
  116. if(blue_flag)
  117. {
  118. ui->label_blue_date->show();
  119. blue_flag = false;
  120. }
  121. else
  122. {
  123. ui->label_blue_date->hide();
  124. blue_flag = true;
  125. }
  126. listdate.push_front(temp2);
  127. update();
  128. if(listdate.size()>999)
  129. {
  130. listdate.pop_back();
  131. }
  132. break;
  133. }
  134. default:
  135. break;
  136. }
  137. }
  138. bool Palmus::eventFilter(QObject *object1, QEvent *event1)
  139. {
  140. if(object1 == ui->label_palmus&&event1->type()==QEvent::Paint)
  141. {
  142. draw_palmus();
  143. }
  144. if(object1 == ui->label_ibi&&event1->type()==QEvent::Paint)
  145. {
  146. draw_ibi();
  147. }
  148. return true;
  149. }
  150. static int temp1;
  151. static int temp2;
  152. void Palmus::draw_palmus()
  153. {
  154. //Draw scale
  155. QPainter painter_scale(ui->label_palmus);
  156. painter_scale.setBrush(Qt::black);
  157. painter_scale.drawRect(0,0,ui->label_palmus->width(),ui->label_palmus->height());
  158. painter_scale.setPen(QPen(Qt::green,0.5));
  159. painter_scale.setRenderHints(QPainter::Antialiasing,true);
  160. int scale_x = ui->label_palmus->width();
  161. int scale_y = ui->label_palmus->height();
  162. painter_scale.drawLine(0,0,0,scale_y);
  163. painter_scale.drawLine(0,scale_y,scale_x,scale_y);
  164. while (scale_y>0)
  165. {
  166. painter_scale.drawLine(0,scale_y,ui->label_palmus->width(),scale_y);
  167. scale_y = scale_y-20;
  168. }
  169. scale_x = 0;
  170. scale_y = ui->label_palmus->height();
  171. while (scale_x<(ui->label_palmus->width()))
  172. {
  173. painter_scale.drawLine(scale_x,scale_y,scale_x,0);
  174. scale_x= scale_x+20;
  175. }
  176. //Draw palmus
  177. QPainter painter(ui->label_palmus);
  178. painter.setRenderHints(QPainter::Antialiasing,true);
  179. painter.translate(0,(ui->label_palmus->height()/2));
  180. painter.save();
  181. painter.setPen(QPen(Qt::red,2));
  182. int x = ui->label_palmus->width();
  183. i = listdate.begin();
  184. temp1 = *i;
  185. for(i=listdate.begin();i!=listdate.end();i=i.operator ++(1))
  186. {
  187. j=i.operator ++(1);
  188. temp2 = *j;
  189. 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()));
  190. temp1 = temp2;
  191. x=x-3;
  192. }
  193. bmp = min(bmp,200);
  194. ui->label_heart_rate->setText("BMP:"+QString::number(bmp,10));
  195. painter.restore();
  196. }
  197. void Palmus::draw_ibi()
  198. {
  199. QPainter painter(ui->label_ibi);
  200. painter.setPen(QPen(Qt::red,2));
  201. int x = ui->label_ibi->width();
  202. k = ibidate.begin();
  203. temp1 = *k;
  204. float temp3 =1024.0;
  205. for(k=ibidate.begin();k!=ibidate.end();k=k.operator ++(1))
  206. {
  207. l=k.operator ++(1);
  208. temp2 = *l;
  209. if(temp1>temp3)
  210. {
  211. temp3 = temp1/1.0;
  212. }
  213. painter.drawLine(x,(temp1/temp3*ui->label_ibi->height()),x-1,(temp2/temp3*ui->label_ibi->height()));
  214. temp1 = temp2;
  215. x=x-1;
  216. }
  217. ui->label_ibi_date->setText("IBI:"+QString::number(*ibidate.begin(),10));
  218. }
  219. //void Palmus::draw_heart()
  220. //{
  221. // QPainter painter(ui->label_heart);
  222. // double x, y, r;
  223. // for (int i = 0; i <= 90; i++)
  224. // {
  225. // for (int j = 0; j <= 90; j++)
  226. // {
  227. // //转换为直角坐标系,设置偏移量,使图像居中
  228. // r = M_PI / 45 * i * (1 - qSin(M_PI / 45 * j)) * 19;
  229. // x = r * qCos(M_PI / 45 * j) * qSin(M_PI / 45 * i) + 100 / 2;
  230. // y = -r * qSin(M_PI / 45 * j) + 100 / 4;
  231. // painter.setBrush(Qt::red);
  232. // painter.setPen(Qt::red);
  233. // painter.drawPoint(x,y);
  234. // }
  235. // }
  236. //}
  237. void Palmus::on_pushButton_clicked()
  238. {
  239. listdate.clear();
  240. update();
  241. emit get_date_flag(0);
  242. }
  243. void Palmus::on_pushButton_2_clicked()
  244. {
  245. listdate.clear();
  246. update();
  247. emit get_date_flag(1);
  248. }
  249. void Palmus::on_pushButton_3_clicked()
  250. {
  251. listdate.clear();
  252. update();
  253. emit get_date_flag(2);
  254. }

 

 

 

 

 

这部分目前也没有做太多的修改,因为没有网络和蓝牙部分的代码,所以好多逻辑还是有问题,需要在正式开的时候重新梳理一下逻辑,现在也指示能够勉强实现。如果有那里有疑问可以联系我,或者有更好的解决方案可以直接找我,欢迎大神们指导,哈哈。

 

界面问题,以前都不怎么会用界面的布局,一般写的也都是嵌入式设备的程序,用的最多的就是全屏显示,剩下的就是绝对布局了。

这次逼着这几学习了一下布局,发现用了就会爱上它,哈哈哈

用了几个布局的,感觉用布局,那你就要提前都想的差不多了,后期在加,感觉好有困难的,也许还是自己用的不熟练,弄了好几次才勉强可以使用了,以后希望可以尝试更多的布局。

 

源代码连接在后期评论中加上

 

 

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/52278585

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。