试图弄清楚如何专门调用回调包装器。我们的代码处理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
,我很难理解回调如何被调用。我查阅了NI文档,但听不懂。
DAQmxCfgSampClkTiming(onTask, "OnboardClock", ON_RATE, DAQmx_Val_Rising,
DAQmx_Val_FiniteSamps, 100);
DAQmxRegisterDoneEvent(onTask, 0, DoneCallbackWrapper, this);
这个让我更加困惑。我相信,每当触发onTask(使用硬件触发器)时,DAQ就会以ON_RATE采样/秒的速率开始对模拟测量值进行数字化处理,一旦将100个采样采样/读取到DAQ缓冲区中,就会调用DoneCallbackWrapper()
。根据此硬件触发信号保持高电平的时间长短,每当DAQ读取100个样本(触发信号为高电平)时,将调用该包装器?或者在读取100个样本之后,仅调用一次回调?
答案 0 :(得分:1)
读取100个样本后,仅调用一次回调
由于slowTask
使用DAQmx_Val_ContSamps
,因此该程序要求进行一次无限(又称连续)采集,并将数据流式传输到主机。使用EveryNSamples
回调程序可以使程序访问和处理设备发送的最新数据。
由于onTask
使用DAQmx_Val_FiniteSamps
,因此程序要求单个采集100
个样本。使用Done
事件可以使程序访问并处理完整的采集和完整的采集。
在您的评论更新中,程序使用
DAQmxCfgDigEdgeStartTrig(onTask, "/PXI2Slot4/PXI_Trig0", DAQmx_Val_Rising));
为onTask
配置digital edge start trigger。当该触发线具有上升沿时,onTask
采集开始,捕获100个样本,停止并调用回调。
如果程序需要在{{1}的每个上升沿获取onTask
的100个样本,则可以在NI 63xx系列设备上使用retriggerable property允许同一任务执行re-run for each trigger event。
更多详细信息在X Series User Manual中:
AI启动触发器也可配置为可重新触发。定时引擎会响应AI启动触发信号上的每个脉冲,生成样本并转换时钟以进行配置的采集。
在时钟生成过程中,计时引擎会忽略AI启动触发信号。时钟生成完成后,计数器等待另一个启动触发器开始另一个时钟生成。图4-22显示了具有三个AI通道和每个触发器四个采样的可重触发模拟输入