关于MATLAB,GUI 上位机接收到下位机数据,解包后输出波形(以脉搏波和袖带压为例)

步骤一:串口设置

上位机和下位机实现数据传输是通过串口,以下是串口设置的内容(当然了,这部分都是基于GUI界面已经画好之后的设置)其中还有一个“打开串口”按钮未作说明,“打开串口”的响应函数中可以设置调用解包函数句柄。

movegui(handles.figure1,'center');%将图窗移动到屏幕上的指定位置
%movegui(h,position) 将图窗 h 移到指定的屏幕位置并保持图窗的大小。
set(handles.popupmenu2,'string',{'4800','9600','14400','19200','38400','57600','76800','115200'});
set(handles.popupmenu3,'string',{'8','9'});
set(handles.popupmenu4,'string',{'1','1.5','2'});
set(handles.popupmenu5,'string',{'NONE','ODD','EVEN'});
set(handles.pushbutton1,'String','打开串口');
Ports = instrhwinfo('serial');
port_num = length(Ports.AvailableSerialPorts);
ports_sum = '';
if port_num > 0
    for i=1:port_num
        ports_sum = [ports_sum,Ports.AvailableSerialPorts(i)];
    end
else
    ports_sum ='None';
end
set(handles.popupmenu1,'string',ports_sum);

步骤二:设置解包函数

当数据发上来后,要及时对数据进行解包,并通过数据传输协议进行数据处理,这一步是关键,解包的思路好坏将关系到程序的执行能力和图像的呈现。因为打包解包这个函数每个工程有自己独特的方式,此处仅截图。
在这里插入图片描述

步骤三:设置回调函数

回调函数的作用在于画波形,曾经我用过c#做过一个GUI,该工程波形的绘制是通过设置x轴y轴的变量,点与点之间连线实现的,matlab在这方面非常方便,用plot函数绘制波形,几乎用不到什么代码。至于timer定时器的使用方法可以去matlab官网查询。

global timer1;%定时器1
timer1 = timer ('TimerFcn',{@drawNibp,handles},'Period',0.1,'ExecutionMode','fixedDelay','StartDelay',0.2);


function  drawNibp(hObject, eventdata, handles)
global Data_NibpCP
global Data_NibpWA
plot(handles.axes1,Data_NibpCP,'g');%画图袖带压
plot(handles.axes2,Data_NibpWA,'g');%画图脉搏波
set(handles.axes1,'XLim',[1 912],'YLim',[500 2500],'Color',[0 0 0]);%设置坐标轴范围
set(handles.axes2,'XLim',[1 912],'YLim',[500 3000],'Color',[0 0 0]);%设置坐标轴范围
set(handles.axes1,'Color',[0 0 0]);
set(handles.axes2,'Color',[0 0 0]);

步骤四:设置回调函数的开始命令

回调函数在matlab中是需要一个开始命令的,以前波形一直没画出来,就是因为没有设置回调函数的start指令,当时怎么都查不出问题出在哪里。

global config_mes
global timer1

switch get(timer1,'Running')
            case 'on'
            case 'off'
                start(timer1);
 end

步骤五下发命令

下发的命令有如下顺序:先下发握手指令,当握手成功时下发模块设置指令,模块设置成功设置后启动无创血压测量命令。这里要说明的是,据个人经验和观察,matlab数据输出和写入都是以十进制数完成的。如果要转别的进制,以十六进制为例要用到如dec2hex,而转换函数是以字符串形式输出的,下位机识别不了字符串。这里以中止测量为例。`

com_pack_nibpStop = [00 00 00 00 00 00 00 00 00 00]; 
  
 switch get(config_mes,'Status')
        case 'open'
          
            fwrite(config_mes, com_pack_nibpStop, 'uint8', 'async');
          
        case 'closed'
          
 end

猜你喜欢

转载自blog.csdn.net/guangjie2333/article/details/88546732
今日推荐