|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
步骤一:串口设置
% H) |$ E( e% y- G' A5 Y, h上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。
$ B; w6 L2 z% n, C/ K; q! V
$ _8 K" e& v/ A+ qmovegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
# a% o! x3 u5 y& N! D; X' N/ [3 R%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。- K% ?. [, H) D
set(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});2 A/ e- q7 t6 V9 E7 {
set(handles.popupmenu3,'string',{'8','9'});
7 h5 d; M- [ R6 o/ Z5 Gset(handles.popupmenu4,'string',{'1','1.5','2'});
2 T& d7 V7 w& q. bset(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});
2 p; E' n! U: rset(handles.pushbutton1,'String','打开串口');
{1 P9 d/ x$ B) c5 Q8 OPorts = instrhwinfo('serial');0 ~8 a& c E7 `2 f5 J3 G, N
port_num = length(Ports.AvailableSerialPorts);( S# n" i+ Q- |- F) y r; A
ports_sum = '';: u3 j# `. q0 V
if port_num > 0# z" W% m! \+ S
for i=1:port_num# ?: Z' s6 L7 h8 \/ g* t# l- J
ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];
) a! r! M( }! n6 o end+ i1 d# F0 b7 @ Q$ w/ p9 @: j
else
$ X' B+ \& w: Q2 P+ s" D6 Y/ d ports_sum ='None';
1 z% Z, n, l1 f* L( b5 {# Tend
) {3 L/ a$ h7 P# }: Yset(handles.popupmenu1,'string',ports_sum);
! m4 p, D" F" R! d6 `+ _: ?% v* v2 `0 z2 l- I, [- w
& g- a3 M& I6 A
步骤二:设置解包函数* P: ?8 x, y7 I8 z' V, R6 M- {
当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。
& H5 ] e/ M: s) |) `7 W5 t0 D0 i6 S9 G6 L1 R) n
8 S* ~3 v1 d# j
- e# L% M7 l% K. @
步骤三:设置回调函数
; o' U- b0 m1 J' W6 J, U3 D% T7 H回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。
/ j/ r6 t) k `) {/ D- ?, e% O' d! m/ Z2 @
global timer1;%定时器16 P: ^/ E9 T. t1 G6 k- j5 _
timer1 = timer ('TimeRFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);
, l; p5 z' V! Q) S6 T# F) v0 Y, \- M4 X& D! N v- @* o" l9 s
+ A5 U, w, B) `, }3 H3 M% T rfunction drawNibp(hObject, eventdata, handles)
) q* j0 b) j( k, ]4 Y( c+ ]9 Hglobal Data_NibpCP
; p4 B5 d9 [: P; N# f( Z9 r* yglobal Data_NibpWA
" G( l( l' }4 t4 o- @$ ~, j- Aplot(handles.axes1,Data_NibpCP,'g');%画图袖带压
0 w/ y H" \" p' [7 ?3 Z( iplot(handles.axes2,Data_NibpWA,'g');%画图脉搏波
, {% O: w! o: |+ Pset(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围5 _& E2 T# ~6 q$ r+ D) [4 N% v H
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围# s, W% }$ j- y; R* D8 T
set(handles.axes1,'Color',[0 0 0]);0 W+ _% Q8 z* a- f8 _* @+ S
set(handles.axes2,'Color',[0 0 0]);) I2 O! V8 o f2 d0 L6 Y+ u0 G
, u0 r3 |/ ~* t5 u- ?3 a
+ a" Q! \2 C' Y& p步骤四:设置回调函数的开始命令8 Y; }; W$ K2 y* ~! Q
回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。& I' Q; H0 J$ h- D
' Q3 j4 V" [2 e' a4 K, U8 bglobal config_mes. I) Z, E; b. m) y5 F7 x( I
global timer1% k3 n" @$ h* G# d" v) p& f
9 \$ N: P+ Z0 ]8 Vswitch get(timer1,'Running')
1 g- [8 ]: v$ |1 t9 Y: {) F( Y case 'on'
; m# [7 W8 m9 ~! ~; H: B case 'off'
& h1 }, V% `7 K2 g( Q. { start(timer1);* k3 i$ ?6 d, G8 I. S9 d( H
end3 M2 v$ v9 o' V* m& m5 }9 u+ G3 Q
7 d/ S# Y2 x; _1 f
* L: L% Z! \1 x8 q; x4 a步骤五下发命令' z; E/ \& Z) ^
下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`6 k* E9 y/ d/ D$ s" D
- D5 w* [+ s: s scom_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00]; ) l$ @2 D; I2 e2 R$ p0 K9 _
# T. U9 ?; d# p' h% T/ r; c switch get(config_mes,'Status')6 r- f3 z/ y' c7 h
case 'open'
9 Y) E9 Z' O9 ^. O5 L2 `7 q$ [: ^9 i5 s, i6 z- w5 z
fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
* s& i4 ?7 D( e3 g% u( q) V; |
. F- r- g- O X6 o3 I" P case 'closed'
6 O# ^! t8 ~% Q G( p5 h" O" ^2 U- W, I0 J1 i3 g) [
end# L$ e8 K$ H ~" k: L
) M& @/ ]! W* d! f9 v3 O7 K& X- P! M7 k+ t
5 I2 v9 i$ J- `. b" `4 A |
|