发表于:2002-08-30 23:03:00
楼主
本人使用PCI-7200采集数据,对采集的数据在内存中操作后再将处理结果写盘,但是发现PCI-7200在连续采集数据时有丢失少量数据的情况!
程序代码如下:
//程序中使用的一些全局变量
#define BUFFER_SIZE 1024*128 //128K双字缓冲(512K字节)
DWORD Buffer[BUFFER_SIZE];
HANDLE hCardEvent;
I16 Card;
BYTE HalfReady;
DWORD count;
//在程序启动时创建事件和生成数采集线程和数据处理线程
hCardEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
AfxBeginThread( ThreadProcess, NULL, THREAD_PRIORITY_NORMAL);
AfxBeginThread( ThreadCard, NULL, THREAD_PRIORITY_NORMAL);
//采集数据的线程的定义
UINT ThreadCard( LPVOID pParam )
{
if( (Card=Register_Card(PCI_7200, 0)) <0 )
{
::MessageBox( NULL, "Register_Card Error !", "Error", MB_OK|MB_ICONERROR );
return 0;
}
if( DI_7200_Config (Card, TRIG_EXT_STROBE, DI_NOWAITING, DI_TRIG_RISING, IREQ_RISING) != 0 )
{
::MessageBox( NULL, "DI_7200_Config Error !", "Error", MB_OK|MB_ICONERROR );
return 0;
}
//使用双缓冲采集
if( DI_AsyncDblBufferMode(Card, 1) != 0 )
{
::MessageBox( NULL, "DI_AsyncDblBufferMode Error !", "Error", MB_OK|MB_ICONERROR );
return 0;
}
if( DI_ContReadPort (Card, 0, NULL, BUFFER_SIZE*2, CLKSRC_EXT_SampRate, ASYNCH_OP) != 0 )
{
::MessageBox( NULL, "DI_ContReadPort Error !", "Error", MB_OK|MB_ICONERROR );
return 0;
}
//开始双缓冲采集
do
{
HalfReady=0;
do {
DI_AsyncDblBufferHalfReady(Card, &HalfReady);
Sleep( 1 );//等待1毫秒,再进行检查
} while (!HalfReady);
DI_AsyncDblBufferTransfer(Card, Buffer);//将数据取出
SetEvent( hCardEvent );//设置事件,使另一线程开始处理数据
} while (1);
DI_AsyncClear(Card, &count);
Release_Card(Card);
return 1;
}
//对数据进行处理的线程的定义
UINT CMultiDataInDlg::ThreadProcess( LPVOID pParam )
{
do
{
WaitForSingleObject( hCardEvent, INFINITE );
ResetEvent( hCardEvent );
//
//在这里对数据缓冲区Buffer中的数据进行操作
//
}while( 1 );
return 1;
}
程序工作时发现每采集一个缓冲区大小的数据,再采下一个缓冲区数据时,就会丢失约16字节数据,即双缓冲工作方式下,两个缓冲区之间会少采集约16个字节的数据.
请问本人编写的程序是问题,还是没有注意到什么事项.
电脑配置:PIII 933/128M SDRAM/20G HARDDISK
PCI-7200插在slot 0
致
礼!
李元梁
lyllzx@sina.com
2002-08-17