因為寫的上一篇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 }
這個程序也實際測試過,可以運行,希望這兩個程序能對大家有幫助,謝謝觀看,有問題請留言。