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

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

用dll在VC++中实现连续采集处理和存储

1.目的是连续采集板卡PCI-4474的数据,并进行处理,存储(采样频率设置为最大102k,每次从通道读取1000个数据)
不知道大家用什么方法来实现的,我的想法是:

2.想法是开两个线程 1用来处理数据 2用来写数据,因为数据量很大,很快,等采集一定时间再存储
在int32 CVICALLBACK EveryNCallback(TaskHandle taskHandle, int32 everyNsamplesEventType, uInt32 nSamples, void *callbackData)这个callback函数里面实现

DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,SAMPLENUMBER,10.0,DAQmx_Val_GroupByScanNumber,l_data,4*SAMPLENUMBER,&read,NULL));
EnterCriticalSection(&g_hCriticalSection);
//将l_data拷贝到全局数组中,
SetEvent(g_hPorcessEvent);//处理这4000个数据)(四个通道,每个通道1000个数据)//告诉采集线程
//索引
g_index+=4000;
if(g_index == SIZE_OF_BUFFER) g_index = 0;//缓冲区满的时候,从头开始计数
if(g_index %(SIZE_OF_BUFFER/2) == 0)
{
    //设置一个大的缓冲区,当大缓冲区存了一半的时候,SetEvent(线程2去存储这个大缓冲区的数据)
}
LeaveCriticalSection(&g_hCriticalSection);


线程1
{
 WaitForSingleObject(g_hPorcessEvent,INFINITE);
 EnterCriticalSection(&g_hCriticalSection);
    //处理4000个数据
 LeaveCriticalSection(&g_hCriticalSection);
}
线程2
{
 WaitForSingleObject(g_hSaveEvent,INFINITE);
 EnterCriticalSection(&g_hCriticalSection);
//存储
if(g_index >= SIZE_OF_BUFFER/2)//如果此时缓冲区的指针到了后面,说明前面已经存储满了
{
   for(int i=0; i<SIZE_OF_BUFFER/2;i++)
   {
    //写缓冲区的前半部分
   }
}
 else
 {
 for(int j=SIZE_OF_BUFFER/2; j<SIZE_OF_BUFFER;j++)
 {
 //写缓冲区的后半部分
 }      
}
LeaveCriticalSection(&g_hCriticalSection);
}

3.不知道这样的流程对不对 我用的是生产者消费者线程,发现采集的时候,SetEvent不能告诉处理线程和存储线程
就是说会有数据丢失,来不及处理和存储,如果 用sleep函数的话是可以的,但是用了sleep岂不是会影响采集卡采集数据?

0 项奖励
1 条消息(共 2 条)
3,127 次查看
是可以用Sleep函数的,并不会影响数据采集。只是该函数的时间参数会影响从计算机缓冲读数的速度,配置合适的时间是可以保证数据的全部读取的。 NI应用工程师 Ben
0 项奖励
2 条消息(共 2 条)
3,019 次查看