hunag:
感谢你的回复!
我试过你说的办法,但是还是不行,程序运行时产生了一个错误,错误代码是 -200018;
我的程序的主要流程是这样的:
再窗口线程中按开始按钮后执行以下代码:
DAQmxErrChk (DAQmxCreateTask("",&AITaskHandle));
DAQmxErrChk (DAQmxCreateAIVoltageChan(AITaskHandle,"Dev1/ai0","",DAQmx_Val_RSE,-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxCfgSampClkTiming(AITaskHandle,"",28400.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,2840));
DAQmxErrChk (DAQmxSetBufInputBufSize(AITaskHandle,284000));
DAQmxErrChk (GetTerminalNameWithDevPrefix(AITaskHandle,"ai/SampleClock",trigName));
DAQmxErrChk (DAQmxCreateTask("",&AOTaskHandle));
DAQmxErrChk (DAQmxCreateAOVoltageChan(AOTaskHandle,"Dev1/ao0","",-10.0,10.0,DAQmx_Val_Volts,NULL));
DAQmxErrChk (DAQmxSetWriteRegenMode(AOTaskHandle,DAQmx_Val_DoNotAllowRegen ));
DAQmxErrChk (DAQmxCfgSampClkTiming(AOTaskHandle,trigName,28400.0,DAQmx_Val_Rising,DAQmx_Val_ContSamps,2840));
DAQmxErrChk (DAQmxWriteAnalogF64(AOTaskHandle,2840,0,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));
DAQmxErrChk (GetTerminalNameWithDevPrefix(AITaskHandle,"ai/StartTrigger",trigName));
DAQmxErrChk (DAQmxCfgDigEdgeStartTrig(AOTaskHandle,trigName,DAQmx_Val_Rising));
AfxBeginThread(ThreadFun,(LPVOID)&AOTaskHandle);
Sleep(10);
m_eventHandle = OpenEvent(EVENT_ALL_ACCESS,FALSE,"DAEvent");
DAQmxErrChk (DAQmxRegisterEveryNSamplesEvent(AITaskHandle,DAQmx_Val_Acquired_Into_Buffer,2840,0,EveryNCallback,(void*)&m_eventHandle));
DAQmxErrChk (DAQmxRegisterDoneEvent(AITaskHandle,0,DoneCallback,NULL));
DAQmxErrChk (DAQmxRegisterDoneEvent(AOTaskHandle,0,DoneCallback,NULL));
/*********************************************/
// DAQmx Start Code
/*********************************************/
DAQmxErrChk (DAQmxStartTask(AOTaskHandle));
DAQmxErrChk (DAQmxStartTask(AITaskHandle));
这些代码完成创建一个AO任务,一个AI任务,注册EveryNSamplesEvent Callback函数,并开始一个工作线程。
在EveryNCallback函数中触发工作线程等待的事件,代码如下:
int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)
{
int32 error=0;
char errBuff[2048]={'\0'};
int32 read = 0;
int i = 0;
count++;
HANDLE* pEvent = (HANDLE*)callbackData;
/*********************************************/
// DAQmx Read Code
/*********************************************/
DAQmxErrChk (DAQmxReadAnalogF64(AITaskHandle,2840,10.0,DAQmx_Val_GroupByChannel,dpCurr,2840,&read,NULL));
if(iFlag)
{
for(;i<2480;i++) {
data[i]= dpCurr[i]/2;
}
dpCurr = dpADBufA;
SetEvent(*pEvent);
}
else
{
for(;i<2480;i++) {
data[i] = dpCurr[i]/2;
}
dpCurr = dpADBufB;
SetEvent(*pEvent);
}
iFlag ^=1;
/*********************************************/
// DAQmx Write Code
/*********************************************/
// DAQmxErrChk (DAQmxWriteAnalogF64(AOTaskHandle,2840,0,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));
Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( DAQmxFailed(error) )
AfxMessageBox(errBuff);
return 0;
}
工作线程启动一个循环,等待在EveryNCallback函数中触发的事件,然后向AO写数据。代码如下:
UINT ThreadFun(LPVOID pParam)
{
int32 error=0;
char errBuff[2048]={'\0'};
TaskHandle* pTaskHandle = (TaskHandle*)pParam;
HANDLE eventHandle = CreateEvent(NULL,FALSE,FALSE,"DAEvent");
while (1) {
WaitForSingleObject(eventHandle,INFINITE);
DAQmxErrChk (DAQmxWriteAnalogF64(*pTaskHandle,2840,0,10.0,DAQmx_Val_GroupByChannel,data,NULL,NULL));
}
Error:
if( DAQmxFailed(error) )
DAQmxGetExtendedErrorInfo(errBuff,2048);
if( DAQmxFailed(error) )
AfxMessageBox(errBuff);
return 0;
}
我把VC++ 6.0下的代码放在附件中