⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ai_continuous.cpp

📁 labview8.2.1与DAQ数据采集原码
💻 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 + -