EDA365电子论坛网

标题: MATLAB,GUI 上位机接收到下位机数据,解包后输出波形(以脉搏波和袖带压为例) [打印本页]

作者: haidaowang    时间: 2020-6-18 15:42
标题: MATLAB,GUI 上位机接收到下位机数据,解包后输出波形(以脉搏波和袖带压为例)
步骤一:串口设置$ V2 ]% w! V$ l/ I  g0 {& H4 d0 u2 a
上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。, v# L  W( v  h. J3 J* h

% @% z# u$ p$ |  I2 j2 l$ vmovegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置0 ]  T1 O1 M7 l4 C7 a" U8 c
%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。
* p. m$ N5 i! D8 nset(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});1 F7 N7 `# A6 s1 G
set(handles.popupmenu3,'string',{'8','9'});! }7 B7 t1 h/ Q6 I$ D
set(handles.popupmenu4,'string',{'1','1.5','2'});# d6 L5 b- B; Q- z
set(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});) ~; }) e4 T: n& ], c9 b* Y: v+ b
set(handles.pushbutton1,'String','打开串口');; ], b! d/ [% O; b2 n- r" n. ?, P
Ports = instrhwinfo('serial');$ Q  o+ `* n/ S+ e3 A' Y
port_num = length(Ports.AvailableSerialPorts);$ v* h7 ^8 @3 Y5 X; B
ports_sum = '';
) c; W$ j4 U: Q" h- \if port_num > 0% Q5 Z" t  L( `% ]: N, N
    for i=1:port_num
) B% M3 J3 K( b$ b# K# b( C        ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];
8 N7 v" H$ d) H4 g- Z) |    end
. c4 P8 A/ d2 z/ Welse
, }4 @" p1 v5 H) H    ports_sum ='None';
* m' H# i+ t) ]end
& T+ S3 B" h) k( m# c- Fset(handles.popupmenu1,'string',ports_sum);" P& Z/ {. n# A( Y( l, N# B; \

  F% q& L9 y+ R0 X
7 I# I; i8 c+ S2 R9 _步骤二:设置解包函数5 P; Z( E) j5 L" H0 m
当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。3 C6 V. n5 l; A$ E. D, ?

) y! Q/ X, p8 S8 R: ? 9 q. Y& B0 \7 I7 C# u

! ^" }; `0 u6 A* m$ @5 I% u步骤三:设置回调函数+ W0 M( F! P+ t* X# `
回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。. \$ ?4 R! z3 F
: _. r* M! C% j. j+ k/ u% a8 P
global timer1;%定时器1
4 q( Z: B: T$ z0 a4 |timer1 = timer ('TimerFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);4 J3 V6 e6 ~3 m

- U6 O- L  M9 f- ]! `! D' J. z. \- B  w* v
function  drawNibp(hObject, eventdata, handles)
) C3 J, s, Z7 X9 ?" q& ]* @global Data_NibpCP' i7 }: I9 T) K# U* K$ ]
global Data_NibpWA
9 {* `' X8 y2 q3 o/ S& }plot(handles.axes1,Data_NibpCP,'g');%画图袖带压5 N2 S( d% b; \+ d0 s
plot(handles.axes2,Data_NibpWA,'g');%画图脉搏波
3 a' ~7 }, v* c5 ]! s  oset(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围* O, \1 y- d1 w3 S- u/ E; W; h
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围/ ?$ }5 o* \$ y; v" p! `9 m
set(handles.axes1,'Color',[0 0 0]);( C* p' U% g! z! @9 R
set(handles.axes2,'Color',[0 0 0]);+ S0 x, L8 b" o! {- y' q

. L8 n8 H4 R- o
+ ]; |6 M$ e/ a8 V' ]7 c步骤四:设置回调函数的开始命令, e  X) [# m6 {
回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。
1 w6 i; L. }7 E3 `" c( q0 n  w
' e& ^2 ~6 c- A5 Q) D+ Kglobal config_mes
9 O5 R# P8 J- uglobal timer1
6 e) w& Y) g3 w. Q  d5 G! h8 n
7 k. q6 k7 Q  D; Hswitch get(timer1,'Running')
- P- M) U+ I# n1 n2 n# B% p            case 'on'7 U' l; T7 F. y" ?2 H& L7 A
            case 'off'
3 N4 s9 A3 L) @9 I1 c6 I8 Q                start(timer1);) }1 O) A& ?, i! @: f
end
) U% R/ U2 T  B: c! y- e% y6 j  ~" B7 O( Q
  O% a# Y! r7 q8 `! J: F
步骤五下发命令
* M! l9 i6 h# u* ?8 x下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`+ v3 K  q  ~8 q/ e' i3 h

& c: d0 f! A  L& zcom_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00]; ! Z3 R6 A: B! z( E' ]( k# F

0 m& r. _3 E% {  @: [ switch get(config_mes,'Status'); F0 W' x" Y- t: d# @+ E
        case 'open'
( U$ P1 t0 m: p5 U# _) T
6 ^8 l* G# [7 N# `            fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
; Y  \" J* y* v* U: s  p8 W
& T4 C$ B4 Y0 Z& g4 j; a- V9 c        case 'closed'- H- R# s  g* C

9 s" ?! ?) ]2 w) e/ G7 G& u4 J end9 N4 Y! D6 v8 R

# f! N6 f; Z" ~% \2 X9 B5 i& z' i4 O: f9 j" r; M8 K" Z) z1 _
! Q& F+ ]: W" N; U9 i( _2 m

作者: regngfpcb    时间: 2020-6-18 16:33
脉搏波和袖带压




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2