不用求别人了,你装好NI-DAQmx驱动后,就可以在下面的文件夹中找到连续采集的例子。
C:\Documents and Settings\All Users\Documents\National Instruments\NI-DAQ\Examples\DAQmx ANSI C\Analog In\Measure Voltage\Cont Acq-Int Clk
谢谢您回复我的帖子,我看过您说的例子,但例子只是将数据读取到一个数组中,我现在的问题是怎样将数据存储成一个一个的文件,而且要连续(关键是连续,将数据存储下来我会做),我之前编了个程序(本来想传上来给老师们帮我看看的,但大了点,传不上来),复制了关键的部分,利用的多线程(第一次用,可能不会用),我的编程思想是:
点击按钮(OnContinuous() )----创建线程1(DoFir())----线程1采集数据----创建线程2(DoSec())----存储线程1的数据(dataA0)
线程2:创建后----线程2采集数据----创建线程1-----存储线程2的数据(dataA1)
我想的是线程1存储数据的同时,线程2采集数据,线程2存储数据的同时,线程1采集数据,这样线程1和线程2形成循环,直到停止程序。
但我存储下来的文件我用MATLAB读取两个文件的数据生成WAV文件,再用COOL EDIT看波形图,有断点,说明两个文件之间的数据不连续。请各位老师指点指点迷津!!!
float64 dataA0[20000000];
float64 dataA1[20000000];
static UINT ThreadFirLauncher( CCADDlg * pTH)
{
return pTH->DoFir();
}
static UINT ThreadSecLauncher( CCADDlg * pTH)
{
return pTH->DoSec();
}
//按钮响应函数
void CCADDlg::OnContinuous()
{
// TODO: Add your control notification handler code here
CString szErr;
m_pFirThread = AfxBeginThread(
(AFX_THREADPROC)ThreadFirLauncher, //thread function
(LPVOID)this, // ptr to this class
THREAD_PRIORITY_NORMAL, //give worker thread priority
0, // same stack size
CREATE_SUSPENDED, // don't let it start yet
NULL ); // same security attributes
if (NULL == m_pFirThread){
szErr = _T("建立Fir线程失败!");
goto bRetErr;
}
m_pFirThread->m_bAutoDelete = FALSE; // keep thread object around
m_pFirThread->ResumeThread (); //let er rip
return;
bRetErr:
MessageBox(szErr,"错误",MB_OK|MB_ICONSTOP);
return;
}
//线程1
int CCADDlg::DoFir()
{
int32 error=0;
TaskHandle taskHandle=0;
char errBuff[2048]={'\0'};
int32 read;
CString m_szErr;
CString str;
float64 m_rate;
uInt64 m_SampsPerChan;
int32 m_numSampsPerChan,m_arraySizeInSamps;
CString szErr;
int i;
FILE* fp;
time_t rawtime;
struct tm * curtime;
int m_numSave;
m_rate = m_rateSamps;
m_SampsPerChan = m_numSamps;
m_numSampsPerChan = m_numSamps;
m_arraySizeInSamps = m_numSamps;
DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,m_MinVal,m_MaxVal,DAQmx_Val_Volts,NULL);
DAQmxCfgSampClkTiming(taskHandle,"",m_rate,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,m_SampsPerChan);
DAQmxStartTask(taskHandle);
DAQmxReadAnalogF64(taskHandle,m_numSampsPerChan,1000.0,DAQmx_Val_GroupByChannel,dataA0,m_arraySizeInSamps,&read,NULL);
//采集数据到dataA0
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
//创建线程2
m_pSecThread = AfxBeginThread(
(AFX_THREADPROC)ThreadSecLauncher, //thread function
(LPVOID)this, // ptr to this class
THREAD_PRIORITY_ABOVE_NORMAL, //give worker thread priority
0, // same stack size
CREATE_SUSPENDED, // don't let it start yet
NULL ); // same security attributes
if (NULL == m_pSecThread){
szErr = _T("建立SEC线程失败!");
goto bRetErr;
}
m_pSecThread->m_bAutoDelete = FALSE; // keep thread object around
m_pSecThread->ResumeThread (); //let er rip
m_numSave = m_numSamps;
time(&rawtime);
curtime = localtime(&rawtime);
str.Format("%04d-%02d-%02d %02d_%02d_%02d.txt",curtime->tm_year+1900,curtime->tm_mon+1,
curtime->tm_mday,curtime->tm_hour,curtime->tm_min,curtime->tm_sec);
if(NULL==(fp=fopen(str,"wb")))
{
szErr.Format("Open file: %s Error!",str);
goto bRetErr;
}
//存储数据到文件
for(i=0; i<m_numSave; i++)
{
fprintf(fp,"%f\n",dataA0[i]);
}
fclose(fp);
return 0;
bRetErr:
MessageBox(szErr,"错误",MB_OK|MB_ICONSTOP);
return 0;
}
//线程2
int CCADDlg::DoSec()
{
int32 error=0;
TaskHandle taskHandle=0;
char errBuff[2048]={'\0'};
int32 read;
CString m_szErr;
CString str;
float64 m_rate;
uInt64 m_SampsPerChan;
int32 m_numSampsPerChan,m_arraySizeInSamps;
CString szErr;
int i;
FILE* fp;
time_t rawtime;
struct tm * curtime;
int m_numSave;
m_rate = m_rateSamps;
m_SampsPerChan = m_numSamps;
m_numSampsPerChan = m_numSamps;
m_arraySizeInSamps = m_numSamps;
DAQmxCreateTask("",&taskHandle);
DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0","",DAQmx_Val_Cfg_Default,m_MinVal,m_MaxVal,DAQmx_Val_Volts,NULL);
DAQmxCfgSampClkTiming(taskHandle,"",m_rate,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,m_SampsPerChan);
DAQmxStartTask(taskHandle);
DAQmxReadAnalogF64(taskHandle,m_numSampsPerChan,1000.0,DAQmx_Val_GroupByChannel,dataA1,m_arraySizeInSamps,&read,NULL);
//读取数据到dataA1
DAQmxStopTask(taskHandle);
DAQmxClearTask(taskHandle);
//创建线程1
m_pFirThread = AfxBeginThread(
(AFX_THREADPROC)ThreadFirLauncher, //thread function
(LPVOID)this, // ptr to this class
THREAD_PRIORITY_ABOVE_NORMAL, //give worker thread priority
0, // same stack size
CREATE_SUSPENDED, // don't let it start yet
NULL ); // same security attributes
if (NULL == m_pFirThread){
szErr = _T("建立Fir线程失败!");
goto bRetErr;
}
m_pFirThread->m_bAutoDelete = FALSE; // keep thread object around
m_pFirThread->ResumeThread (); //let er rip
m_numSave = m_numSamps;
time(&rawtime);
curtime = localtime(&rawtime);
str.Format("%04d-%02d-%02d %02d_%02d_%02d.txt",curtime->tm_year+1900,curtime->tm_mon+1,
curtime->tm_mday,curtime->tm_hour,curtime->tm_min,curtime->tm_sec);
if(NULL==(fp=fopen(str,"wb")))
{
szErr.Format("Open file: %s Error!",str);
goto bRetErr;
}
//存储数据到文件
for(i=0; i<m_numSave; i++)
{
fprintf(fp,"%f\n",dataA1[i]);
}
fclose(fp);
return 0;
bRetErr:
MessageBox(szErr,"错误",MB_OK|MB_ICONSTOP);
return 0;
}