c语言代码演示编写NI采集程序,如何使用daqmx_val_contSamps模式回调函数DAQmxRegisterEveryNSamplesEvent和如何停止回调函数DAQmxRegisterEveryNSamplesEvent和DAQmxRegisterDoneEvent
时间: 2024-05-15 20:15:02 浏览: 14
以下是一个简单的NI采集程序示例,展示如何使用DAQmxRegisterEveryNSamplesEvent回调函数和DAQmxRegisterDoneEvent回调函数:
```c
#include <stdio.h>
#include "NIDAQmx.h"
#define DAQmxErrChk(functionCall) { if( DAQmxFailed(error=(functionCall)) ) goto Error; }
#define SAMPLE_RATE 1000.0
#define NUM_CHANNELS 1
#define BUFFER_SIZE 1000
TaskHandle taskHandle = 0;
int32 error = 0;
float64 dataBuffer[BUFFER_SIZE];
int32 EveryNSamplesCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);
int main(void) {
// Create task
DAQmxErrChk(DAQmxCreateTask("", &taskHandle));
// Add analog input channel
DAQmxErrChk(DAQmxCreateAIVoltageChan(taskHandle, "Dev1/ai0", "", DAQmx_Val_RSE, -10.0, 10.0, DAQmx_Val_Volts, NULL));
// Set sample rate
DAQmxErrChk(DAQmxCfgSampClkTiming(taskHandle, "", SAMPLE_RATE, DAQmx_Val_Rising, DAQmx_Val_FiniteSamps, BUFFER_SIZE));
// Register EveryNSamplesEvent callback function
DAQmxErrChk(DAQmxRegisterEveryNSamplesEvent(taskHandle, DAQmx_Val_Acquired_Into_Buffer, BUFFER_SIZE, 0, EveryNSamplesCallback, NULL));
// Register DoneEvent callback function
DAQmxErrChk(DAQmxRegisterDoneEvent(taskHandle, 0, DoneCallback, NULL));
// Start task
DAQmxErrChk(DAQmxStartTask(taskHandle));
// Wait for user input to stop task
printf("Press Enter key to stop acquisition.\n");
getchar();
// Stop task
DAQmxErrChk(DAQmxStopTask(taskHandle));
// Clear task
DAQmxErrChk(DAQmxClearTask(taskHandle));
printf("Acquisition stopped.\n");
return 0;
Error:
DAQmxGetExtendedErrorInfo(errBuff, 2048);
printf("DAQmx Error: %s\n", errBuff);
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
return -1;
}
int32 EveryNSamplesCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData) {
int32 readCount = 0;
DAQmxErrChk(DAQmxReadAnalogF64(taskHandle, nSamples, 10.0, DAQmx_Val_GroupByScanNumber, dataBuffer, BUFFER_SIZE, &readCount, NULL));
// Process data here
return 0;
Error:
return -1;
}
int32 DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData) {
printf("Acquisition complete.\n");
return 0;
}
```
在此示例中,我们创建了一个任务,并添加了一个模拟输入通道。然后,我们设置了采样率和每个缓冲区的大小,并使用DAQmxRegisterEveryNSamplesEvent函数注册了一个回调函数。该回调函数将在每个缓冲区中收集足够的数据时调用,并读取数据。我们还使用DAQmxRegisterDoneEvent函数注册了一个DoneCallback回调函数,以便在任务完成时通知我们。最后,我们启动任务,并在用户按下Enter键时停止任务。在停止任务后,我们清除任务并结束程序。
需要注意的是,我们可以通过调用DAQmxRegisterDoneEvent函数注册DoneCallback回调函数来通知我们任务何时完成。同时,我们还可以随时调用DAQmxStopTask函数来停止任务。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)