模拟输出停止(没有理由)?!

3个观点(过去30天)
托拜厄斯
托拜厄斯 2011年12月14日
嘿,大家好!
我希望你们中有人能帮助我!
我正在工作的一个程序使用大全工具箱和一个国家仪器I/O USB卡。我试图通过使用模拟输出对象连续输出数据。它的Samplerate为100,在对象启动之前,100个值进入队列。在启动一个timerfunction后,使用"putdata"对新数据进行排队。前100个样本输出良好,但当对象停止时,队列中仍然有400个值。它停止时没有任何错误消息。
物体为什么会停止?
在我看来,对象应该一直运行到队列... .中没有更多的数据
如果你需要进一步的信息,请告诉我!

答案(3)

沃尔特·罗伯森
沃尔特·罗伯森 2011年12月14日
通常USB缓冲数据,直到USB包大小(接近1000字节)满足。如果每个样本的数据是2个字节,那么缓冲区将被耗尽,直到剩下不到1000个字节。
USB不适合连续输出短数据包——至少在没有接触到Mathworks从未向用户公开过的USB细节的情况下不适合。
1评论
托拜厄斯
托拜厄斯 2011年12月14日
嘿,沃尔特!
谢谢你关心我的问题!
我不认为这是usb的问题,因为我使用下面的行显示在命令窗口中有多少数据已经在准备发送的硬件中。
readyToOutput = hObj。SamplesAvailable
这个命令显示在模拟对象停止之前,有400个值排队等待被输出。对象停止后,此属性被设置为零。
那么,你怎么看?

登录发表评论。


是一家古普塔
是一家古普塔 2011年12月14日
你能发布一点代码吗?另外,您使用的是新的基于会话的接口(R2011b)还是旧接口?
如果你正在使用遗留接口(类比输出对象),那么你可能需要设置这个属性:
1评论
托拜厄斯
托拜厄斯 2011年12月14日
嘿是一家!
也谢谢你关心我的问题!
我使用的是Matlab 2011。我现在还不能详细说明是哪个版本,因为我现在在家而不是在大学。
问题发生在我使用遗留下面的程序部分。在这部分的程序中,我没有使用基于会话的接口,因为我需要连续的数据来创建一个逐步响应的“Liveplot”。
我认为基于会话的获取并不是为了获取“liveplot”的连续数据而创造的,我说错了吗?
我已经阅读了关于“repeatoutput”的文档,并理解它的方式是,这个函数接受已经排队的数据,并在您输入时多次在循环中输出它。这使得这个函数对我来说毫无价值,因为由于计时器函数,我必须能够将NEW数据编入队列。
这是我的代码:
声明连续模拟输出
% outputobjet erzeugen
gDyn_ao = analogoutput(“nidaq”、“Dev3”);
%Outputkanäle an Objekt anfügen
addchannel (gDyn_ao, 1);%升起
%迅速冯
firstData (1) = gDyn_von;
%起始日期
h = 2: gDyn_sampleRate
firstData (h) = gDyn_bis;%升起
结束
%TimerfunctionCallback deklarieren und ersten Datensatz übergeben
设置(gDyn_ao TimerFcn, {@ao_enqueueMoreData, firstData});
设置触发TimerfunctionCallback的时间
时间= ((gDyn_ao.SampleRate * 0.1) / gDyn_ao.SampleRate);
集(gDyn_ao, TimerPeriod,时期);
% Schreibrate setzen
集(gDyn_ao, SampleRate gDyn_sampleRate);
% Ersten Daten类比设备übergeben
firstData = firstData ';
putdata (gDyn_ao firstData);
%%开始kontinuierliche,类比Objekte
全局变量重设
gDyn_databufferHeat = [];
gDyn_databufferTemp = [];
gDyn_timebuffer = [];
输入和输出
gDyn_analogObjects = [gDyn_ai gDyn_ao];
% I / O aktivieren
开始(gDyn_analogObjects);
timerfunction:
% analogue - timercallback: getriggert neue Daten in den OutputPuffer schieben
函数ao_enqueueMoreData (hObj、事件处理)
全球gDyn_sampleRate;
全球gDyn_von;
全球gDyn_bis;
全球zaehler;
zaehler = zaehler + 1
readyToOutput = hObj。SamplesAvailable
% MaxQueueableData = hObj。MaxSamplesQueued
AusgegebenenSamples = hObj。SamplesOutput
%如果(hObj.SamplesAvailable +披散下来(nextData)) > = hObj.MaxSamplesQueued
%如果(hObj.SamplesAvailable + gDyn_sampleRate) > = hObj.MaxSamplesQueued
如果hObj。SamplesAvailable > = gDyn_sampleRate * 4
返回
结束
generiere neue输出
k = 1: gDyn_sampleRate
nextData (k) = gDyn_bis;%升起
结束
河豚里的熊
nextData = nextData ';
putdata (hObj nextData);
你能找出错误吗?

登录发表评论。


是一家古普塔
是一家古普塔 2011年12月14日
查看文档,它指出,在启动类比输出对象之前,必须使用putdata对所有数据进行排队。
所以TimerFcn将不起作用,除非你做以下几点:a)改变触发器类型为手动,b)并在放入更多数据后重新触发。
基于Session的架构提供了一个更方便的解决方案,这非常适合:
我假设您同时进行输入和输出!你可以使用后台操作来连续地对要输出的数据进行排队(使用datarerequired回调),例如: //www.tianjin-qmedu.com/help/toolbox/daq/bsob84e-1.html#bsovlz7-1
你也可以同时进行输入和输出,并使用'DataAvailable'为输入做一个实时绘图! //www.tianjin-qmedu.com/help/toolbox/daq/bsotkz_-1.html (如果你希望输出数据发生在后台,你可能需要使用startBackground())
7评论
托拜厄斯
托拜厄斯 2011年12月20日
好的,谢谢。:)

登录发表评论。

s manbetx 845

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!