实现MatlabListener,它通知矩阵中有足够的数据
我试图在我的MATLAB DAQ程序中实现一个侦听器,它会通知我所获取的数据矩阵中是否有足够的数据可用(然后保存备份等) 我知道数据采集工具箱中存在类似的事件实现MatlabListener,它通知矩阵中有足够的数据,matlab,events,listener,Matlab,Events,Listener,我试图在我的MATLAB DAQ程序中实现一个侦听器,它会通知我所获取的数据矩阵中是否有足够的数据可用(然后保存备份等) 我知道数据采集工具箱中存在类似的事件'DataAvailable'和notifywhenadaavailable超过(触发事件时的频率)。不幸的是,工具箱不支持我的设备,我通过使用计时器并使用fprintf和fscanf(仪器控制工具箱)查询仪器值,自己设置了一个DAQ程序 对于实现这一点的第一种方法,我阅读了文档(即事件和侦听器语法),并尝试实现一个示例,其中空矩阵由For
'DataAvailable'
和notifywhenadaavailable超过
(触发事件时的频率)。不幸的是,工具箱不支持我的设备,我通过使用计时器并使用fprintf
和fscanf
(仪器控制工具箱)查询仪器值,自己设置了一个DAQ程序
对于实现这一点的第一种方法,我阅读了文档(即事件和侦听器语法),并尝试实现一个示例,其中空矩阵由For
循环展开,侦听器在有例如100个可用数据点时发出通知。然而,我完全失败了,因为我不知道如何实现,侦听器如何“通知”这一点。是否可以创建“自己的”事件,或者MATLAB只能侦听文档中给定的现有事件
我不确定我是否正确理解了这个概念,如果有人能给我一个快速的概述,如果可能,以及如何可能,我会很高兴
下面是一个代码示例。我完全知道,它还不能像这样工作,但我希望它清楚地表明我正在努力做什么:
%% Class definition
classdef DAQClass < handle
properties
DataMatrix %Does this make sense to put the matrix as property?
%Maybe better as event data?
end
events
EnoughData
end
methods %Does it make sense to put the condition when to notify, in a method??
%how can I access it for my listener
function IfEnoughDataAvailable(obj,DataMatrix)
if (length(DataMatrix)>100)
notify(obj,'EnoughData');
end
end
end
end
%% Add listener, run code to fill data matrix
DAQObject=DAQClass;
DAQObject.DataMatrix=[];
lh = addlistener(DAQObject,'EnoughData',@reactToEvent);
for k=1:1000
DAQObject.DataMatrix(k)=k;
end
%%类定义
classdef DAQClass<句柄
性质
DataMatrix%将矩阵作为属性有意义吗?
%也许作为事件数据更好?
结束
事件
足够的数据
结束
方法%在方法中设置何时通知的条件有意义吗??
%我如何为我的听众访问它
函数IfEnoughDataAvailable(obj、DataMatrix)
如果(长度(数据矩阵)>100)
通知(obj,“足够数据”);
结束
结束
结束
结束
%%添加侦听器,运行代码以填充数据矩阵
DAQObject=DAQClass;
数据矩阵=[];
lh=addlistener(DAQObject,'EnoughData',@reactoEvent);
对于k=1:1000
数据矩阵(k)=k;
结束
我会这样实现它,使用属性侦听器而不是侦听器(注意,我将DataMatrix
设置为SetObservable
):
请注意,
reactoEvent
方法本身执行长度检查,并且只要DataMatrix
发生更改,就会调用reactoEvent
。因此,您可能希望在其中加入一些逻辑,以便在DataMatrix
增加到100以上时,只调用一次,而不是每次超过100时(例如,它可以处理DataMatrix
的内容,然后将DataMatrix
重置为[]
,将其视为缓冲区。你能提供一点代码吗?你可以在每次fscanf
后检查,但你确实需要查看代码以提供更多建议。只需编辑我的问题:)
classdef DAQClass < handle
properties (SetObservable)
DataMatrix = []
end
properties (Access = private)
DataMatrixListener
end
methods
function obj = DAQClass
obj.DataMatrixListener =...
addlistener(obj, 'DataMatrix', 'PostSet', @obj.reactToEvent);
end
function reactToEvent(obj, ~, ~)
if length(obj.DataMatrix)>100
disp('Enough data available') % Do actual thing here
end
end
end
end
>> d = DAQClass
d =
DAQClass with properties:
DataMatrix: []
>> for i = 95:105
disp(i)
d.DataMatrix = 1:i;
end
95
96
97
98
99
100
101
Enough data available
102
Enough data available
103
Enough data available
104
Enough data available
105
Enough data available