|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
步骤一:串口设置
7 C/ Z. f4 N+ O- ~. E4 Z: V上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。& F5 ^6 Q Q6 j1 ?9 }6 V: i
" r; V# v2 i% g+ L; {
movegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
5 z3 _; q5 L5 @( E0 M%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。& b% M5 [8 }! r, P
set(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});
( W( f2 M4 p3 d$ D% Y$ Dset(handles.popupmenu3,'string',{'8','9'});0 c7 x7 v3 s7 o
set(handles.popupmenu4,'string',{'1','1.5','2'});
+ d) f) d+ I2 T- S- K n6 fset(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});4 }) y% N4 W, R2 P9 \
set(handles.pushbutton1,'String','打开串口');0 q. ]; X3 t4 ?
Ports = instrhwinfo('serial');# G V$ C) Z. v
port_num = length(Ports.AvailableSerialPorts);3 @' I. K9 `4 v: K, u0 N/ R
ports_sum = '';
) N' H: I) F, fif port_num > 0+ e3 R9 w j6 q4 \$ W" V% s) l2 ]
for i=1:port_num
& N* o3 J; P$ O) p/ m) u ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];0 i) K: }; {8 b" a
end) _" @5 [3 W7 B0 F! a( a& G
else" S9 {8 t! t! v) i! h' e& `7 r
ports_sum ='None';+ D }. P0 v" @$ ~
end
6 b. g/ d% I/ z0 e4 Tset(handles.popupmenu1,'string',ports_sum);. b! V0 y0 w" v' W7 r3 o6 p' \
# l) t) Q7 {1 r1 Y
0 K. J, h1 C6 F4 U) q2 G8 m n步骤二:设置解包函数& T9 n3 U# T3 O7 {- C+ K
当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。
4 l5 G X+ t) ^; \! \' @8 ~9 J' B+ n4 x/ H% [7 z8 Y
! L: |% S, W' G# J; D$ ?" `! _
% w! v- y: m; ~+ n5 K5 q* a x( H步骤三:设置回调函数9 b# C, v8 @6 ]$ Y
回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。' p( \) o7 H+ Z; o9 u3 P+ o4 F% d* m
1 @, R2 g" |, W8 L+ N0 w# w. g& }! tglobal timer1;%定时器1$ R' o9 ], u k3 y O
timer1 = timer ('TimeRFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);6 F m# P6 t- d
. }8 d ~, ~) x5 w
`9 D8 r* K# q7 R( U& Hfunction drawNibp(hObject, eventdata, handles)
2 f& o5 y- X" l, @* P( v2 lglobal Data_NibpCP/ d0 h: Z6 u# Z
global Data_NibpWA5 C) `" u( f6 o m4 W
plot(handles.axes1,Data_NibpCP,'g');%画图袖带压: J' i7 z$ q' n& Z
plot(handles.axes2,Data_NibpWA,'g');%画图脉搏波
0 t4 _; X& |2 G" w6 N# L2 Aset(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围
3 E$ B1 A2 m7 n; ~+ Eset(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围( P) N$ Y* R$ i7 U, x. ?1 Z' I
set(handles.axes1,'Color',[0 0 0]);- B+ u3 T! D$ i, k
set(handles.axes2,'Color',[0 0 0]);
0 B4 u ^1 |( |4 o, P
9 f1 f$ {. X5 S6 |
, V" S( y2 `3 U" D- t步骤四:设置回调函数的开始命令
! O. W/ k* k3 f' R* v回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。# Y% O. K' J& [, V$ E
! l$ ^& x- {( I$ Z- F! s( i
global config_mes
" Y+ D/ ]! Z; Aglobal timer1
; {$ ?- e4 p0 p7 j/ C1 }1 n
! ?7 [; w" H. V. xswitch get(timer1,'Running')! ?8 L2 i2 t6 Y/ \% {
case 'on'
. `$ W. g; k7 z: k: \* c1 K! Z case 'off'* z* U# K" g" o- s' u/ A9 W9 l% \
start(timer1);
8 A' o8 d# s+ O1 [ end( P0 s% Z0 p. e) g: G& H
9 {; w1 r0 l% Y2 S: L$ L2 d- C
; G4 f6 I$ ~* J+ s) }$ U$ u
步骤五下发命令- o7 S+ Q. y+ P
下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。` R. C, X+ L4 {; [
* Y' H8 k& c" ?% ^% \7 e$ ?com_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00];
6 T9 P3 _0 c$ V' h
/ |; C& g. [8 {6 X p1 V: l switch get(config_mes,'Status')6 r7 j4 O2 ^3 E8 X+ J+ U4 o- {, Q
case 'open'- a* v& W2 }* g7 ~1 J. O6 o2 b
& _$ O `/ V- z. r
fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
; |% N3 |# j4 ~% _1 u9 h# k* G+ f+ T/ [( e; E) N
case 'closed'8 [% ~; B) M: J9 h
9 k! x o; C& N! \: s" J$ k1 _
end
* ]3 k! G& J: o* _4 M6 I; z# }4 t0 P" V/ O" ~
$ N0 V+ x$ J1 I6 n2 @7 g O/ J
: D2 ?6 Y! i% u7 _( S: } |
|