一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

1.如果函数状态出现错误,就用goto语句跳转到错误Error函数块去执行。Error需要自己定义

#define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else

2.创建任务函数------DAQmxCreateTask

1)函数原型

int32 DAQmxCreateTask (const char taskName[], TaskHandle *taskHandle);

2)函数作用

创建一个任务,且创建任务之后必须要清除这个任务(DAQmxClearTask)

如果这个函数在循环体内,则必须把清除任务函数也放在函数体内,以避免浪费太多内存

3)关键点

1 DAQmxErrChk (DAQmxCreateTask("",&gAItaskHandle));//输入任务
2 DAQmxErrChk (DAQmxCreateTask("",&gAOtaskHandle)); //输出任务

第一个是名字,第二个是句柄。名字可以不用,用空格也可以。

3.输入通道配置函数-------DAQmxCreateAIVoltageChan

1)函数原型

int32 DAQmxCreateAIVoltageChan (TaskHandle taskHandle, const char physicalChannel[], const char nameToAssignToChannel[], int32 terminalConfig, float64 minVal, float64 maxVal, int32 units, const char customScaleName[]);

2)函数作用

创建测量电压的通道,并将通道添加到使用taskHandle指定的任务中。可以不止一个通道

3)关键点

taskHandle--------任务句柄。gAItaskHandle

physicalChannel[]------物理通道名,例:"Dev1/ai0:1",去labwindows查看

nameToAssignToChannel-------起一个别名,可以不用

terminalConfig-----------终端配置,可以选择下列四种

minVal,maxVal-------测量电压的上下限制

units------单位,可以指定是伏特,或者是自定义比例值。

customScaleName--------自定义比例值时调用,不用的时候写null

4.DAQmxCreateAOVoltageChan-------创建电压输出通道

1)函数原型

int32 DAQmxCreateAOVoltageChan (TaskHandle taskHandle, const char physicalChannel[], const char nameToAssignToChannel[], float64 minVal, float64 maxVal, int32 units, const char customScaleName[]);

2)函数作用

与上面那个函数类似,创建输出通道,可以不止一个通道。

3)关键点

与上面类似

5.DAQmxCfgSampClkTiming-----配置采样时钟

1)函数原型

int32 DAQmxCfgSampClkTiming (TaskHandle taskHandle, const char source[], float64 rate, int32 activeEdge, int32 sampleMode, uInt64 sampsPerChanToAcquire);

2)函数作用

设置采样时钟的源、采样时钟的速率以及要获取或生成的采样数。

3)关键点

source[]------样本时钟的源端。要使用设备的内部时钟,请使用NULL或OnboardClock。

rate------采样频率;

activeEdge-----指定在时钟的哪个边缘上获取或生成样本。在采样时钟的上升沿上采集或生成采样,或者在样本时钟的下降沿上采集或生成样本

sampleMode----采样模式,是连续采样还是有限采样

sampsPerChanToAcquire-----每个通道的采样点。如果sampleMode为DAQmx Val_FiniteSamps,则为任务中的每个通道采集或生成的样本数。如果sampleMode是DAQmx_Val_ContSamps,则NI DAQmx使用此值确定缓冲区大小。

我自己需要注意的点:我的电压输出是优点,采样是连续的。

6.此外还有触发设置函数,但是我不想改动了,可以参考示例DAQmxCfgDigEdgeStartTrig

7.往设备中写数据DAQmxWriteAnalogF64

8从设备中读数据DAQmxReadAnalogF64

9.DAQmxRegisterDoneEvent-------注册回调函数

1)函数原型

int32 DAQmxRegisterDoneEvent (TaskHandle taskHandle, uInt32 options, DAQmxDoneEventCallbackPtr callbackFunction, void *callbackData);

2)函数作用

注册回调函数,以便在任务因错误而停止或有限获取任务或有限生成任务完成执行时接收事件。当任务显式停止(例如通过调用DAQmxStopTask)时,不会发生Done事件。(因为标红的部分,害我调试了一下午)

3)关键点

callbackFunction----自定义一个函数,事件发生时希望DAQmx调用的函数。

传入此参数的函数必须具有以下原型:

int32 CVICALLBACK callbackFunction(TaskHandle TaskHandle,int32 status,void*callbackData);

进入回调后,task handle参数包含发生事件的任务的句柄。status参数包含事件发生时任务的状态。如果状态值为负,则表示有错误。如果状态值为零,则表示没有错误。如果状态值为正,则表示警告。callbackData参数包含您在此函数的callbackData参数中传递的值。参数传递NULL将注销事件回调函数。

10.DAQmxRegisterEveryNSamplesEvent----值满传输事件

1)函数原型

int32 DAQmxRegisterEveryNSamplesEvent (TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, uInt32 options, DAQmxEveryNSamplesEventCallbackPtr callbackFunction, void *callbackData);

2)函数作用

注册一个回调函数。将设定数量的数据从PC缓冲区传输到设备,或者将设定数量的数据从设备传输到缓冲区。

当您显式停止任务时,将丢弃任何挂起的事件。例如,如果调用DAQmxStopTask,则不会收到任何挂起的事件。

3)关键点

事件发生时希望DAQmx调用的函数。传入此参数的函数必须具有以下原型:

int32 CVICALLBACK回调(TaskHandle TaskHandle,int32 everyNsamplesEventType,uInt32 nSamples,void*callbackData);

进入回调后,task handle参数包含发生事件的任务的句柄。

everySamplesEventType参数包含您在此函数的everySamplesEventType参数中传递的值。

nSamples参数包含您在此函数的nSamples参数中传递的值。

callbackData参数包含您在此函数的callbackData参数中传递的值。

posted on 2023-02-20 10:20  一杯清酒邀明月  阅读(511)  评论(0编辑  收藏  举报