|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
步骤一:串口设置: n8 _! {5 c. o8 x* j6 _7 A
上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。
+ x N- j) |0 i- R- q
2 v9 I! [; h$ K9 e1 g6 f3 l4 C% omovegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
0 j, u' ^0 x$ D3 M. b( I" O%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。
8 j0 E% C, ?6 y. @) Y. J, iset(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});+ c0 u! l4 r0 C4 `9 ^" Y: ]
set(handles.popupmenu3,'string',{'8','9'});
5 W6 I6 B3 v9 d3 {3 wset(handles.popupmenu4,'string',{'1','1.5','2'});2 @; p- s! v6 q7 V4 L
set(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});. {' \" c9 w4 F2 ?( F
set(handles.pushbutton1,'String','打开串口');: ^, h, y5 s- ]; s
Ports = instrhwinfo('serial'); W( `# U- O) N& c6 C. Z' u
port_num = length(Ports.AvailableSerialPorts);
: q& p* F* Y) S0 @ports_sum = '';7 q' C# [( q6 g0 U. G, A$ J
if port_num > 09 @( g0 k& ^3 x/ R3 e* ~
for i=1:port_num
) T3 g# F6 A Z2 N9 e; r- D ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];3 x. i4 [9 ^7 U
end/ m" \" v. {, s( r
else
' w4 r, n9 \, c) Z, R# K. { ports_sum ='None';
9 t' l* R7 \! i, }end3 f5 a. }7 p% e
set(handles.popupmenu1,'string',ports_sum);/ r( ]; J: b* j9 F6 l
4 G- l7 n; _; j# s: g( \: M, v9 C4 \/ @0 @' N
步骤二:设置解包函数5 s2 Z8 O3 G# A& G* S3 \) b, G c
当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。
+ a+ N u7 }* V7 } M$ v: ^
$ O. _, `# v0 a. T' @
* B+ r, D" C# k9 Q0 E! d6 g n3 @
" K# _% G5 G+ P8 ]步骤三:设置回调函数
% K4 a5 {- R: m" t& x回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。
. A6 [5 g0 Z" ]5 p- q6 \8 Z5 ~, Q7 z0 x
global timer1;%定时器16 S/ b2 ^' |9 U$ k- _! G" n( S8 D
timer1 = timer ('TimeRFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2); [" _& Z, v1 l# r, J) w* d5 c0 D, F
/ Z" u, O5 h+ f9 Z$ X
' g3 c' H2 ~, Z2 Ffunction drawNibp(hObject, eventdata, handles)
: C- f R$ H+ qglobal Data_NibpCP: {5 W' O& {3 U8 M$ ~: D
global Data_NibpWA( }. z+ A* z' Y2 @- k: k9 ]8 j d
plot(handles.axes1,Data_NibpCP,'g');%画图袖带压
: o: D9 X2 T- tplot(handles.axes2,Data_NibpWA,'g');%画图脉搏波; F% c' f) Q3 H4 c
set(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围8 N+ {- x5 f. B+ u
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围" U1 f3 }1 M/ Z$ R4 j
set(handles.axes1,'Color',[0 0 0]);- D1 g* @6 \! B6 j' V
set(handles.axes2,'Color',[0 0 0]);
& O/ {2 B. o! W; ~2 m8 L$ N- A# j! ?" _; A. w$ H, ?, E& W D @ V1 m: N
+ q) m) g9 u" y& ]; k/ p, [) z5 K; B/ \
步骤四:设置回调函数的开始命令( X; J1 m( H& T' T& _8 c
回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。8 ^+ M; ^2 Y( f. w6 z
# H/ {: D1 ^) V
global config_mes; l- r2 W& O$ ~9 y# m% \) r0 u
global timer1
( _/ O/ U6 a# D8 N
5 Q9 z1 O( I, D. f- R( r3 X* xswitch get(timer1,'Running')& F6 t5 h% S) G4 ]3 c
case 'on'2 t% K9 i8 Q6 a0 Q! R
case 'off'% Z: V% u' {* P) \. r% }; K/ z. f
start(timer1);* V3 W4 o0 v8 D- T( h* O
end, M' b# o8 I# N2 G$ N. b. R
3 r6 _! y l/ {) G. U6 \/ b
/ S2 \8 I, v; Q5 W" L6 I2 R
步骤五下发命令
2 |( c3 @9 V& q9 q }1 r3 t下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`+ W- v* l. U" P( h
. g9 i! y. ]2 {4 ~1 z1 ^$ i
com_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00];
: T1 T0 w: P! m* S0 L- Q8 u& s* `2 B$ ^* C: L6 |
switch get(config_mes,'Status')/ w; I& Q& X6 q/ n: p0 U1 o
case 'open'
/ `) M* k% W. [8 V! \ k' J
; y' j, [$ F$ z2 f& ?8 w+ q, J fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
1 x4 P0 _ g' _: q" F+ h! G- ?: f# E/ `! P- ]) n$ W3 b2 i8 B$ b
case 'closed'
# p, e" p5 W; z) c ~# ?
0 m1 q G% L. c" ` end
5 w# r. A; I: Q1 x# c y$ I# w4 P3 E! H# K4 q, A
/ V# F' ^$ W7 I: `2 |7 a+ G# j
% f8 K& S, I9 ]$ d
|
|