应用NI的DAQmx提供的Api对他的PXI6123卡进行采集出现丢数问题,不知道哪块设置有问题,下边是采集程序:
//采集
void CTestSampleDlgDlg::OnBtnTest()
{
if (DAQmxCreateTask("",&taskHandle)<0)//创建任务
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxCreateAIVoltageChan(taskHandle,"Dev2/ai0","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL)<0)
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxCfgSampClkTiming(taskHandle,"",100000.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,10000*10)<0)
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxSetReadOverWrite(taskHandle,DAQmx_Val_OverwriteUnreadSamps)<0)
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxSetReadRelativeTo(taskHandle,DAQmx_Val_MostRecentSamp)<0)
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxSetReadOffset(taskHandle,-10000))
{
DispDAQmxErrorInfo();
return;
}
m_hMainWnd =(HWND)this;
if(DAQmxRegisterEveryNSamplesEvent(taskHandle,DAQmx_Val_Acquired_Into_Buffer,10000,0 ,EveryNCallbackCard0,NULL)<0)
{
DispDAQmxErrorInfo();
return;
}
if(DAQmxRegisterDoneEvent(taskHandle,0,DoneCallback,NULL))
{
DispDAQmxErrorInfo();
return;
}
if (DAQmxStartTask(taskHandle)<0)
{
DispDAQmxErrorInfo();
return;
}
}
//注册的回调函数
int32 CVICALLBACK EveryNCallbackCard0(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
int32 error=0;
char errBuff[2048]={'\0'};
static int totalRead=0;
int32 read=0;
CTestSampleDlgDlg *pDlg=(CTestSampleDlgDlg *)m_hMainWnd;
if(!pDlg->m_bStop)
return 0;
float64 *pData=new float64[10000];
if(DAQmxReadAnalogF64(taskHandle,10000,10.0,DAQmx_Val_GroupByScanNumber,pData,10000,&read,NULL)<0)
{
pDlg->DispDAQmxErrorInfo();
return -1;
}
SCANDATA *pScanData =new SCANDATA;
pScanData->counts =read;
pScanData->pData =pData;
pScanData->m_Hwnd=pDlg->m_hWnd;
pDlg->SendMessage(WM_FINASH,0,(LPARAM)pScanData);//发送消息给显示的函数Show
delete pScanData;
delete []pData;
return 0;
}
//显示
void CTestSampleDlgDlg::show(WPARAM wParam,LPARAM lParam)//*********显示曲线图
{
CNiReal64Vector vol[8];//存放8个通道的数据
SCANDATA *pScan=(SCANDATA *)lParam;
m_Graph.SetDefaultXFirst(0);
m_Graph.SetDefaultXInc(1);
if((pScan->counts>0)&&m_bStop)
{
for(int i = 0;i < pScan->counts;i++)
{
vol[0].Append(pScan->pData[i]);
}
m_Graph.SetChartLength(m_Graph.GetChartLength()+pScan->counts);
m_Graph.GetPlots().Item(1).ChartY(vol[0],1.0/100000);
}
}