文章目录
基于R2016a版本,我做了一个实现串口数据监测功能的app。分篇总结一下,本文主要介绍函数间怎么实现变量的传递。
1、全局变量类型 global;
定义global类型的变量,即全局变量。
每一个要用到该全局变量的函数,都要重新声明 gloal x。当然,如果你在一个地方修改了 x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。
2、作为app的属性传递;
如下定义Serial变量
访问该变量的方式如下:
app.Serial
3、setappdata函数为句柄添加数据;
相关函数setappdata(obj,name,val)、getappdata(obj,name)、rmappdata(obj,name) ,其中obj为对象的句柄(可缺省,用 0来代替),name为变量名,val为给变量更新的值
举例:
定义变量COM,给变量赋值
setappdata(0,\'COM\',0);
获取COM的值
value=getappdata(0,\'COM\');
删除该变量
mappdata(0,\'COM\')
4、跨空间计算evalin和赋值assignin;
这里的跨空间跨的是matlab工作区和app 工作区两个函数运行的空间,在app工作区可以通过evalin和assignin实现与matlab工作区的交互。
- Assignin函数基本语法
assignin(ws, \'var\', val)
其中ws可赋值为’base’ or ‘caller’,分别表示基本工作空间和app工作空间,
Assinin函数将值val指定给工作空间ws中的变量var,若变量var不存在,则创建一个变量var。
从一个函数function向MATLAB工作空间中输入数据;
在一个函数function内部,需要改变一个在caller function函数工作空间中定义的变量,
- evalin函数基本语法
evalin(ws, expression);
[a1, a2, a3, ...] = evalin(ws, expression);
在特定的工作空间ws执行MATLAB语句expression,expression执行返回值可以通过[a1, a2, a3, …] 读取。
举例,在app中获取文件名和路径后在matlab 工作区加载,代码如下:
[filename,pathname] =uigetfile({\'*.mat\';\'*.m\';},\'Select Cfg parameter\',\'..\App\ParaCfg\');
if ~filename
return;
end
assignin(\'base\',\'filename\',filename);
assignin(\'base\',\'pathname\',pathname);
evalin(\'base\',\'load([pathname,filename]);\');
5. 将数据保存到文件,需要时读取
save 存储数据
save (filename, var)%filename:存储的文件名;var 待存储的变量
load(importdata)加载数据
importdata(filename);
或
load(filename);
这种方式涉及到磁盘读写,速度当然会有影响的,一般情况不用,通常用在保存以及导入某个较大变量时才会使用!
更多方式:
还有其他的传递方式,但我感觉以上的几种基本上够用了,感兴趣的可以参考GUI的参数传递方式,和app 的原理基本上是一致的,不赘述。