用C語言給NI數據采集卡編程序實現多路數據的同時采集


  因為寫的上一篇NI數據采集卡的程序有人留言說想要實現多路數據的同時采集,我沒有及時回復,深感抱歉,在此寫一篇關於NI數據采集卡的多路數據同時采集的程序

  第一個程序實現的功能:六路數據同時采集,采集有限個數據,並且保存到txt文檔中。采用的是參考單端接地的方式,參考單端接地指的是我們測量的每一路的值是該路相對AI GND的電壓值。對參考單端接地不了解的話可以看NI-DAQmx C Reference help


  不多說,上程序。

 1 #include <stdio.h>
 2 #include "NIDAQmx.h"
 3 #pragma comment(lib,"NIDAQmx.lib")
 4 #include<iostream>
 5 using namespace std;  6  
 7 #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
 8  
 9 int main(void) 10 { 11     int32       error=0; 12  int32 per_num; 13     float64     data[6000]; 14     TaskHandle taskHandle=0; 15     char        errBuff[2048]={'\0'}; 16     DAQmxErrChk (DAQmxCreateTask("",&taskHandle)); 17     DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:5","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL)); 18     DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",20000,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000)); 19  
20     DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0:5",DAQmx_Val_RSE)); 21     //DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,PER_NUM0,0,EveryNCallback,this)); 22     //DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));
23  
24     /*********************************************/
25     // DAQmx Start Code
26     /*********************************************/
27  DAQmxErrChk (DAQmxStartTask(taskHandle)); 28     DAQmxErrChk(DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&per_num,NULL)); 29     FILE *fp1=fopen("data1.txt","w+"); 30  
31     for(int l=0;l<6000;l++) 32  { 33         fprintf(fp1,"%f",data[l]); 34         fputc('\n',fp1); 35  } 36  fclose(fp1); 37 Error: 38     if( DAQmxFailed(error) ) 39         DAQmxGetExtendedErrorInfo(errBuff,2048); 40     if( taskHandle!=0 ) { 41         /*********************************************/
42         // DAQmx Stop Code
43         /*********************************************/
44  DAQmxStopTask(taskHandle); 45  DAQmxClearTask(taskHandle); 46  } 47     if( DAQmxFailed(error) ) 48         printf("DAQmx Error: %s\n",errBuff); 49     printf("End of program, press Enter key to quit\n"); 50  getchar(); 51     return 0; 52 }

這個程序實測過,可以使用,希望能夠對大家有幫助。

第二個程序實現的功能是對多路數據進行實時連續的采集與保存,采用的也是參考單端接地的方式。程序如下:

 1 #include <stdio.h>
 2 #include "NIDAQmx.h"
 3 #pragma comment(lib,"NIDAQmx.lib")
 4 #include<iostream>
 5 using namespace std;  6  
 7 #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
 8  
 9 int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData);  10 int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData);  11  
 12 float64     data[6000];  13  
 14 int main(void)  15 {  16     int32       error=0;  17     TaskHandle  taskHandle=0;  18     char        errBuff[2048]={'\0'};  19  
 20     /*********************************************/
 21     // DAQmx Configure Code
 22     /*********************************************/
 23     DAQmxErrChk (DAQmxCreateTask("",&taskHandle));  24     DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0:5","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));  25     DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",1000,DAQmx_Val_Rising,DAQmx_Val_ContSamps,1000));  26  
 27     DAQmxErrChk (DAQmxSetAITermCfg(taskHandle,"Dev2/ai0:5",DAQmx_Val_RSE));  28     DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,1000,0,EveryNCallback,NULL));  29     DAQmxErrChk (DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL));  30  
 31     /*********************************************/
 32     // DAQmx Start Code
 33     /*********************************************/
 34  DAQmxErrChk (DAQmxStartTask(taskHandle));  35  
 36     printf("Acquiring samples continuously. Press Enter to interrupt\n");  37  getchar();  38 Error:  39     if( DAQmxFailed(error) )  40         DAQmxGetExtendedErrorInfo(errBuff,2048);  41     if( taskHandle!=0 ) {  42         /*********************************************/
 43         // DAQmx Stop Code
 44         /*********************************************/
 45  DAQmxStopTask(taskHandle);  46  DAQmxClearTask(taskHandle);  47  }  48     if( DAQmxFailed(error) )  49         printf("DAQmx Error: %s\n",errBuff);  50     printf("End of program, press Enter key to quit\n");  51  getchar();  52     return 0;  53 }  54  
 55 int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)  56 {  57     int32       error=0;  58     char        errBuff[2048]={'\0'};  59     static int  totalRead=0;  60     int32       read=0;  61     float64        dddd=0.001;  62     //float64 data[6000],last=0;
 63  
 64     /*********************************************/
 65     // DAQmx Read Code
 66     /*********************************************/
 67     DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByScanNumber,data,6000,&read,NULL));  68     if( read>0 ) {  69         for(int i=0;i<6000;i=i+6)  70  {  71             cout<<data[i]<<endl;  72  }  73         FILE *fp2=fopen("data2.txt","w+");  74         for(int l=0;l<6000;l++)  75  {  76              fprintf(fp2,"%f",data[l]);  77              fputc(',',fp2);  78              fprintf(fp2,"%f",dddd*l);  79              fputc('\n',fp2);  80  }  81  fclose(fp2);  82  }  83  
 84 Error:  85     if( DAQmxFailed(error) ) {  86         DAQmxGetExtendedErrorInfo(errBuff,2048);  87         /*********************************************/
 88         // DAQmx Stop Code
 89         /*********************************************/
 90  DAQmxStopTask(taskHandle);  91  DAQmxClearTask(taskHandle);  92         printf("DAQmx Error: %s\n",errBuff);  93  }  94     return 0;  95 }  96  
 97 int32 CVICALLBACK DoneCallback(TaskHandle taskHandle, int32 status, void *callbackData)  98 {  99     int32   error=0; 100     char    errBuff[2048]={'\0'}; 101  
102     // Check to see if an error stopped the task.
103  DAQmxErrChk (status); 104  
105 Error: 106     if( DAQmxFailed(error) ) { 107         DAQmxGetExtendedErrorInfo(errBuff,2048); 108  DAQmxClearTask(taskHandle); 109         printf("DAQmx Error: %s\n",errBuff); 110  } 111     return 0; 112 }

這個程序也實際測試過,可以運行,希望這兩個程序能對大家有幫助,謝謝觀看,有問題請留言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM