首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用回调和持久变量在MATLAB中连续获取数据

使用回调和持久变量在MATLAB中连续获取数据
EN

Stack Overflow用户
提问于 2011-08-31 13:31:59
回答 2查看 5K关注 0票数 2

我最近刚刚开始使用MATLAB从数据采集板上获取数据,并且需要一个函数来连续地获取数据(即,直到我从函数中取出数据)。为此,我使用32位windows操作系统上的数据采集工具箱。

基于matlab帮助中的文档和这个站点上的一些答案,我发现在我的输入句柄中添加了通道之后,我应该:

  1. 将我的“SamplesPerTrigger”设置为Inf
  2. 将“TimerPeriod”设置为某个值以触发“TimerFcn”
  3. 将“TimerFcn”设置为某个子函数回调,该回调将数据附加到持久性变量

这样做对吗?

我的代码如下:

代码语言:javascript
复制
  function acquire_arena_test(samprate,daq_device ,device_ID ,channels, saveroot)
        setup.SampleRate = samprate;
        setup.DAQdevice = {daq_device, device_ID};
        setup.AIChannels = channels;            
        setup.SaveRoot = {saveroot};


        ai = analoginput(setup.DAQdevice{1},setup.DAQdevice{2});
        addchannel(ai,[setup.AIChannels]);
        set(ai,'SamplesPerTrigger',Inf);
        set(ai,'TimerPeriod',0.5);
        set(ai,'TimerFcn',{@AcquireData,ai});

        start(ai);

        while(strcmpi(get(ai,'Running'),'On'))
            pause(1)
        end

        stop(ai);
        time = datestr(now,30);
        save([saveroot time], 'data');
        delete(ai);
        clear ai;


        function AcquireData(hObject, ~)
            persistent totalData;
            data = getdata(hObject);
            if isempty(totalData)
                totalData =data;
            else
                totalData = [totalData; data];
            end

初始模拟输入肯定工作正常。我已经尝试过让AcquireData回调'TimerFcn‘的许多排列。我收到的错误是

`?使用==> acquire_arena_test>AcquireData太多输入参数时出错。

警告:正在禁用TimerFcn回调。若要启用回调,请设置TimerFcn属性。`

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-31 21:32:49

很抱歉回答了我自己的问题,但我想明白了。毕竟不需要扳机。使用国家仪表板(或者声卡),您只需将LoggingMode更改为“磁盘”,并指定一个文件来保存.daq (数据采集工具箱)文件,以保存与LogFileName一样的文件。如果要使用板上的内存,请将模式更改为磁盘和内存。有用的文件:

http://www.mathworks.com/help/toolbox/daq/f12-16658.html

下面的脚本在暂停期间获取数据,只要您希望它是..。

代码语言:javascript
复制
daqreset;
clear all;
ai = analoginput('nidaq','Dev1');
chans = addchannel(ai,0:6);
set(ai,'SamplesPerTrigger',Inf);
set(ai,'SampleRate',1000)
set(ai,'LogToDiskMode','Overwrite')
set(ai,'LogFileName','log.daq')
set(ai,'LoggingMode', 'disk') 

start(ai)

pause()
stop(ai)

data = daqread('log.daq');
delete(ai);

请注意,您仍然需要将'SamplesPerTrigger‘设置为Inf,这样才能正常工作。谢谢乔纳斯的帮助。

票数 1
EN

Stack Overflow用户

发布于 2011-08-31 18:29:20

我认为用于设置TimerFcn的语法是错误的。你写

代码语言:javascript
复制
set(ai,'TimerFcn',{@AcquireData,ai});

但这意味着您的函数AcquireData将使用树参数调用:AcquireData(ai, event, ai)作为在此解释,这当然会触发错误消息,因为AcquireData函数只接受两个参数。只需将代码更改为

代码语言:javascript
复制
set(ai,'TimerFcn',@AcquireData);

它应该可以工作;ai对象将作为第一个参数自动传递(参见上面MATLAB文档的链接)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7257650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档