|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
步骤一:串口设置* a% v$ U; e. h; Q) V
上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。: b! [) I F6 L# N7 ]/ q# g. {( J+ J5 _
& |2 [( P: H9 d3 F
movegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
; e1 [5 n$ l7 h1 ?7 y%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。
1 |1 N9 A3 k: f; H7 Gset(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});
, a, I5 j: x$ g/ `0 Lset(handles.popupmenu3,'string',{'8','9'});# ?0 W" s9 [# a0 l n
set(handles.popupmenu4,'string',{'1','1.5','2'});
$ V* [9 ~: v; T; ?9 V$ ?set(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});
5 X! R. s2 R3 T3 N( N# t1 Uset(handles.pushbutton1,'String','打开串口');
+ T, y, h' a/ i- Q; b9 r7 F) KPorts = instrhwinfo('serial');
4 X4 Q9 [6 f/ w9 S" hport_num = length(Ports.AvailableSerialPorts);
! j2 b; o: `% m( _- _9 G; Y& Aports_sum = '';: ^# G( @, f5 K! [; X" S
if port_num > 0% C0 K3 W9 i7 g, q5 g' D
for i=1:port_num
5 u/ ~$ X0 [- T, q( ~4 K( z- P ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];
* x [+ x' t- D! a' p( U end
3 \ A7 x1 m+ P8 N; O. pelse
6 ^' B# P" h: |: i$ G" c, C: X ports_sum ='None';
4 o, [4 i8 B8 j& B9 s/ iend
# e% p" _( ]) L9 x* d i' kset(handles.popupmenu1,'string',ports_sum);" o( p4 ` l$ C4 [% y
- j' M& N3 }/ @
* q$ V1 N; z4 Q. Z步骤二:设置解包函数; x2 ~6 i$ g' M& T% h
当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。/ Q% @ E+ `7 M' T9 x
5 f- X" ]- q! W8 s! v; l, P
! o, b+ A2 {( G, l; s" ^
; v2 [4 c: [- X ^9 x, D8 K2 H6 N步骤三:设置回调函数, J/ b' L+ ~" u3 c; @
回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。; z0 [8 H& ^/ w; V1 J
# D6 y1 @+ Y2 s, b1 Q2 Y6 ?global timer1;%定时器1
* R0 Q1 M3 J# }timer1 = timer ('TimeRFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);
0 r3 V; Z. l5 L) @% [7 J" `) g- z2 ~. J' C
% U1 F! W: m+ [) i0 a3 n' x% ^0 h" p" W( I8 _% Q2 x' h) K2 r
function drawNibp(hObject, eventdata, handles)
! z) n# Q# L7 k3 dglobal Data_NibpCP
9 M) V2 H. T1 H* B- o% U" Zglobal Data_NibpWA# c6 @( Y+ n- g3 o0 d
plot(handles.axes1,Data_NibpCP,'g');%画图袖带压( L, K5 X! `8 [- V7 a- X
plot(handles.axes2,Data_NibpWA,'g');%画图脉搏波3 P& Q0 v. J I6 [+ r( ^3 U7 }" P
set(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围( f. t N" @4 T$ Y' @1 w
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围7 n# p: N' _4 Z
set(handles.axes1,'Color',[0 0 0]);- P* m0 Q( }0 k. I
set(handles.axes2,'Color',[0 0 0]);
% \4 u9 R' b. J7 t9 _% g9 {, @6 _ |2 x& ^* a5 o8 G; k1 @) P. T! e4 D! o
! x; U7 ?. E+ L' Y2 i5 P* P# @, C
步骤四:设置回调函数的开始命令
1 w4 B/ f" C- C. y# {$ X Q- J, R回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。3 U; c _* T( Q+ D4 w* T9 `
6 p+ x$ J# A2 z! C% [# ?
global config_mes
; t7 Q7 h; h7 O) Qglobal timer1
: l$ g' o% [- V8 d, U. ]- B8 _2 \. m/ r' h
switch get(timer1,'Running'); l4 w, D' n% F2 h4 H
case 'on' A2 ?" b; @; V$ \
case 'off'8 A5 j/ Q( F5 m( O# D9 u# U t# b
start(timer1);
1 l h2 t& i! N& k' M' v5 @ end" ~; u% ?* R0 j
; @2 o# e9 }- k8 ?; |+ m: K, R2 }2 z$ V3 }0 S) X! k- a) x' m
步骤五下发命令
) f; L n3 X6 e4 R" o下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`
X0 m2 _! S7 Y5 F% f7 ]1 l) N& C1 D: \. _
com_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00];
: B- U& @5 G: c9 _3 S ~- ~4 G& d" P% E; {# v# |2 ] S" r
switch get(config_mes,'Status')0 ]- K% Q3 L6 D% q$ u
case 'open'5 F" _" S" h& g$ x+ O" x1 P
) B3 L2 Z2 a& u' Z fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');4 j" z' u# q# }
9 { y2 J3 [0 @) {; P
case 'closed'" c4 }. c5 C' n, N+ b/ P% M7 V; }& T
% \2 A7 N6 L* F; S2 U
end
/ S, ^ Y, z- t- ^0 Y7 w/ Q. @; h- t2 { h) O, Q
* A$ b7 H' S+ ^1 w9 e" U3 r" t7 z$ k7 Q3 t
|
|