NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

跪求!VC编程实现数据连续采集及存储!

已解决!
转到解答

各位老师好:

        本人今年毕业,刚刚参加工作。组长给我了一块NI PCI-6132数据采集卡,要求我用VC编程使它连续采集数据并将数据存储下来。我弄了很久存储下来的数据不能连续。后来打电话给NI,NI工程师说用LabVIEW可以实现,我把这个想法告诉组长后,组长说不行,那样还要学LabVIEW。他说给我的时间够多了。所以现在我没办法了,跪求各位老师帮帮我,教教我怎么做,有源码更好(因为很急,正逢金融危机,别因这事把我开了啊),其他板卡的也行,我可以借鉴借鉴。拜托拜托!!!!

0 项奖励
1 条消息(共 10 条)
8,065 次查看

不用求别人了,你装好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

0 项奖励
2 条消息(共 10 条)
8,059 次查看
解答
已被主题作者 acoldifsh 接受

谢谢您回复我的帖子,我看过您说的例子,但例子只是将数据读取到一个数组中,我现在的问题是怎样将数据存储成一个一个的文件,而且要连续(关键是连续,将数据存储下来我会做),我之前编了个程序(本来想传上来给老师们帮我看看的,但大了点,传不上来),复制了关键的部分,利用的多线程(第一次用,可能不会用),我的编程思想是:

 

点击按钮(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;
}

0 项奖励
3 条消息(共 10 条)
8,045 次查看

。。。。程序太长了。

要连续保存为一个个文件是什么意思?一个通道对应一个文件?还是一段数据保存为一个文件?

0 项奖励
4 条消息(共 10 条)
8,037 次查看
我现在的程序是将一个通道的一段数据(可以设定,如1秒的,10秒的,等等)保存为一个文件,我要先把一个通道的弄出来了,再看怎么弄4个通道一起的。
0 项奖励
5 条消息(共 10 条)
8,024 次查看
那你的工作主要是在文件创建和关闭的判断上了,我对VC的文件操作不熟,不能在编程上给出什么意见了,呵呵
0 项奖励
6 条消息(共 10 条)
8,017 次查看

好了,我已经解决了,我上面所说的方法是错的,编程思想上就是错的,呵呵。

我用另外的方法解决了,谢谢各位啦!!!

0 项奖励
7 条消息(共 10 条)
7,973 次查看
你好我也是通过C++来做NI设备采集的,遇到了类似问题,如何和你联系,取取经!
0 项奖励
8 条消息(共 10 条)
7,591 次查看
hello, can you telle us how have you solved this problem?
0 项奖励
9 条消息(共 10 条)
6,764 次查看

你好,我有点问题想请教你一下,怎么联系

0 项奖励
10 条消息(共 10 条)
4,562 次查看