[英]Callbacks: Difference between DAQmxRegisterDoneEvent() and DAQmxEveryNSamplesEvent
试图弄清楚如何专门调用回调包装器。 我们的代码处理了slowTask
和onTask
。 在slowTask
期间,我处理以下两行(特定于此问题):
DAQmxCfgSampClkTiming(slowTask, "OnboardClock", GUI_RATE,
DAQmx_Val_Rising, DAQmx_Val_ContSamps, 1);
DAQmxRegisterEveryNSamplesEvent(slowTask, DAQmx_Val_Acquired_Into_Buffer, 1,
0, EveryNCallbackWrapper, this);
我知道在这里,每当缓冲区填充一个样本时,就会调用EveryNCallbackWrapper
。
对于onTask
,我onTask
理解回调如何被调用。 我查阅了NI文档,但听不懂。
DAQmxCfgSampClkTiming(onTask, "OnboardClock", ON_RATE, DAQmx_Val_Rising,
DAQmx_Val_FiniteSamps, 100);
DAQmxRegisterDoneEvent(onTask, 0, DoneCallbackWrapper, this);
这个让我更加困惑。 我相信只要触发onTask(使用硬件触发器),DAQ就会以ON_RATE采样/秒的速率开始对模拟测量值进行数字化处理,一旦将100个采样采样/读入DAQs缓冲区,就会调用DoneCallbackWrapper()
。 取决于此硬件触发信号保持高电平的时间,每次DAQ读取100个样本(触发器为高电平)时,将调用此包装器?或者在读取100个样本之后,仅调用一次回调?
读取100个样本后,仅调用一次回调
由于slowTask
使用DAQmx_Val_ContSamps
,因此该程序要求进行无限 (也称为连续)采集,并将数据流式传输到主机。 使用EveryNSamples
回调使程序可以访问和处理设备发送的最新数据。
因为onTask
使用DAQmx_Val_FiniteSamps
,所以该程序要求单次采集100
样本。 使用“ Done
事件,程序可以访问和处理完整的采集和完整的采集。
在您的评论更新中,程序使用
DAQmxCfgDigEdgeStartTrig(onTask, "/PXI2Slot4/PXI_Trig0", DAQmx_Val_Rising));
为onTask
配置数字边沿启动触发器 。 当该触发线具有上升沿时, onTask
采集开始,捕获100个样本,停止并调用回调。
如果程序需要在/PXI2Slot4/PXI_Trig0
每个上升沿为onTask
采集100个样本, onTask
可以使用NI 63xx系列设备上的可重触发属性 ,该属性允许针对每个触发事件重新运行同一任务。
更多详细信息在X系列用户手册中 :
AI启动触发器也可配置为可重新触发。 定时引擎响应于AI Start Trigger信号上的每个脉冲,生成样本并转换时钟以进行配置的采集。
在时钟生成过程中,定时引擎会忽略AI Start Trigger信号。 时钟生成完成后,计数器等待另一个启动触发器开始另一个时钟生成。 图4-22显示了一个可重触发的模拟输入,每个输入具有三个AI通道和四个采样
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.