📄 ai_continuous.cpp
字号:
/////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <iostream.h>
#include "NIDAQmx.h" // 添加NI-DAQmx C API的头文件
// 定义宏DAQmxErrChk(functionCall),用于检查程序运行过程中是否发生错误
#define DAQmxErrChk(functionCall) {if(DAQmxFailed(error=(functionCall))) {goto Error;}}
#pragma comment (lib, "NIDAQmx.lib")
// 声明回调函数
int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);
int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);
//**主函数***********************//
int main()
{
int32 error=0; // 错误代码
TaskHandle taskHandle=0; // 任务句柄
float64 rate; // 采样率
uInt32 nSamples; // 每次读取的样本数
char errBuff[2048]={'\0'}; //存储错误信息的字符串数组
cout<<"输入采样率:";
cin>>rate;
cout<<"每次读取样本数:";
cin>>nSamples;
// 创建任务
DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
// 创建模拟输入电压测量通道,这里选择Dev1/ai0物理通道作为测量通道
DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
// 定时设置,设为采用内部时钟的连续采样
DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",rate,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));
// 当发生设备将nSamples个采集到的样本送入缓存的事件时,触发执行回
// 调函数EveryNCallback,将缓存中的数据读出,以实现连续采集的目的
DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,nSamples,0,EveryNCallback,NULL));
// 当发生任务因出错或有限操作结束而停止的事件时,触发执行回调函数
// DoneCallback。若任务是因为调用DAQmxStopTask函数等明确原因而停
// 止的,则不会执行回调函数
DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));
// 启动任务
DAQmxErrChk (DAQmxStartTask(taskHandle));
cout<<"正在进行连续采集,按回车键中止"<<endl<<endl;
getchar(); // 等待输入一个字符,用于控制连续采集的结束
Error: // goto语句跳转标识符,若前面程序运行过程发生错误,则跳转到此处
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( taskHandle!=0 )
{
// 停止任务
DAQmxStopTask(taskHandle);
// 清除任务
DAQmxClearTask(taskHandle);
}
if( DAQmxFailed(error) )
cout<<"DAQmx 错误:"<<errBuff<<endl;
cout<<endl<<"程序已中止,按回车键退出"<<endl;
getchar();
return 0;
}
//**定义回调函数EveryNCallback***//
int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
int32 error=0;
char errBuff[2048]={'\0'};
static int totalRead=0; // 读取样本总数,声明为静态变量后,只有
// 第一次进入EveryNCallback函数时为其赋
// 值,以后再进入时将不再重新赋值
int32 read=0; // 每次实际读取样本数
float64* readData=new float64[nSamples];
// 读取nSamples个数据并存储于readData数组中
DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,nSamples,10.0,DAQmx_Val_GroupByScanNumber,readData,nSamples,&read,NULL));
if( read>0 )
{
totalRead+=read;
cout<<"读取"<<read<<"个样本,";
cout<<"总共获取了"<<totalRead<<"个样本"<<'\r'; //输出读取状态
cout.flush(); //刷新输出流,显示输出
}
Error:
if( DAQmxFailed(error) ) //判断读取过程是否出错
{
// 读取过程出错,停止、清除任务并输出出错信息
DAQmxGetExtendedErrorInfo(errBuff,2048);
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
cout<<"DAQmx 错误:"<<errBuff<<endl;
}
delete [] readData; //释放分配给数组的内存
return 0;
}
//**定义回调函数DoneCallback*****//
int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)
{
int32 error=0;
char errBuff[2048]={'\0'};
// 判断是否因为发生错误而使任务停止
DAQmxErrChk (status);
Error:
if( DAQmxFailed(error) )
{
DAQmxGetExtendedErrorInfo(errBuff,2048);
// 任务已经停止,故只需清除任务
DAQmxClearTask(taskHandle);
cout<<"DAQmx 错误:"<<errBuff<<endl;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -