|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
步骤一:串口设置4 W9 C+ N+ ~8 k/ p6 m
上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。
1 t' F1 O5 B4 [7 d. j0 Z: s& y, p
" k9 ^, h5 t- B9 [4 P, i, ymovegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
! q3 W/ E# S) ?%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。1 D; a9 ?- s. I6 i# j
set(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});( d: c. F: D1 ~8 y: Y' \( N, [
set(handles.popupmenu3,'string',{'8','9'});
4 k1 C O5 N8 ~ s: k$ g. j' v6 Oset(handles.popupmenu4,'string',{'1','1.5','2'});1 [7 H X. y) U* ~/ c, r( @
set(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});$ p4 @9 B8 |, `0 |& n
set(handles.pushbutton1,'String','打开串口');
8 w8 ?2 W' ^6 Z5 JPorts = instrhwinfo('serial');+ `. P" w& I1 ?+ I8 W! ?5 G% o
port_num = length(Ports.AvailableSerialPorts);
* @1 _. O7 c3 j( `- zports_sum = '';
, V2 n0 t1 q" P! E2 F0 c; aif port_num > 0
' `6 v; u: t+ W: F for i=1:port_num0 x3 W7 J5 w4 {
ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];
. U. @1 j2 k$ ` k; }7 U) f end
5 r( R& i. g& \/ t. gelse
) k5 f# @$ p( e2 ]( g2 S. G0 `9 | ports_sum ='None';
7 I3 p8 q9 B+ ?* eend
, F) |! f4 S* `6 G. t- {set(handles.popupmenu1,'string',ports_sum);
' n. M- L+ A' b6 n- {: S& ^1 A6 e. v4 o8 ?* }
K: A: d, O5 `5 e# S9 m) I步骤二:设置解包函数
4 p; Q: A, z) Q6 H当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。) |) G! t- N& ^5 Z
# ^: g0 y# D- B$ d0 m, P
( K8 W* ~5 C# _$ x* t
U5 w; J$ }9 G3 P$ D
步骤三:设置回调函数8 j8 l, E( s+ s+ `, t4 m
回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。
8 A E& B2 H% H) U6 Q, s* w9 `% @$ ^& p8 s Q" |+ E( g+ k
global timer1;%定时器1
# i( e r! L2 j4 |: x, Ftimer1 = timer ('TimeRFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);
0 V( `+ `' J* g% O* g1 `0 l
$ o6 o' [& d% j; ]6 M ^" M
* X* m. y% p1 ` O, zfunction drawNibp(hObject, eventdata, handles). f. `$ g- A h1 u0 \4 R
global Data_NibpCP
+ P8 P0 |* e6 B3 L- Iglobal Data_NibpWA+ n6 u3 Y5 B' Z/ v4 e4 l
plot(handles.axes1,Data_NibpCP,'g');%画图袖带压; P" n+ T# w+ m7 W
plot(handles.axes2,Data_NibpWA,'g');%画图脉搏波
( F3 }( D2 L6 W+ D) fset(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围" o6 S6 T: f4 m9 I
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围
8 ^0 |, o+ Z* \& xset(handles.axes1,'Color',[0 0 0]);# _+ ?- y2 v6 b c, e+ J2 O
set(handles.axes2,'Color',[0 0 0]);
$ W- k1 j9 n$ s! u/ r, o5 ~0 L6 ]
* c/ p! {, e( M& A% }
# ~3 X! X% j {3 k, ]步骤四:设置回调函数的开始命令! m k1 C. e, h3 l/ J( \. T
回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。; g. B& h" b6 @4 j x5 B9 ]
' \0 c5 r4 h1 u, R( Rglobal config_mes5 _/ ^( V9 `; M# |
global timer1
" R; N0 y$ C d# n' a' j( {4 Q- V n5 ~& c+ m: h
switch get(timer1,'Running')( o0 e. M, u* x0 X
case 'on'
* C+ [+ o ?9 _9 w2 H case 'off'2 @+ }& n3 H8 {9 V+ C( o
start(timer1);$ _" I) x4 @, |' y. G) f
end
8 `% X* M7 P' J9 C' R
4 [# {, }- R3 X9 N* r
) d: N- ^' n+ Q7 \步骤五下发命令
( m( |9 w# L. r4 K) ]下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`
) r6 ?2 E; @4 Z$ t
7 W8 m/ _7 m# j% Q& J* J' L) ^com_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00]; 2 Q. |/ L8 a$ ^; k& z. S
# I/ D% b, y9 b) m$ k2 G) r$ f0 f$ L
switch get(config_mes,'Status')
7 H1 i1 d% r4 K case 'open'( A: |6 r( d" |" K5 V
; K, I$ ^+ d. @* b5 E0 z2 c
fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
1 v3 u: U6 r. z: v1 N5 }: ~: I) N/ R& X9 J( T& ?
case 'closed'
5 D2 V3 M' X0 ] w C* I# A/ Y* o, h- n. r
end
2 V# c) E: c: a. I
; ?' k& S/ R+ m, o5 k- `9 u) g1 F3 w) L
3 h$ E" [, D5 Z) t% c |
|