请教PCI-7200采集数据 点击:1552 | 回复:8



lyllzx

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年8月17日
发表于: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



gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2002-08-22 18:43:00
1楼
请问你用到的数据传输率有多快?由于PCI-7200的FIFO实在太小,在较高速度连续数据传输时确实比较容易丢失数据。根据经验,PCI-7200连续数据传输时的极限速度也就是1MB/s。

lyllzx

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年8月17日
发表于:2002-08-23 01:18:00
2楼
张先生:您好! 1. 外部设备时钟为256KHZ时(这时数据为1MB/S),丢失数据的情况经常发生,每次丢失4-16字节数据,将外部设备的时钟降为128K时,丢失数据的情况大为减少,但是在有其它程序运行时就又频繁丢失数据,如边运行杀毒程序扫描电脑硬盘边采集数据,这时丢失数据字节的情况就比较严重.在时钟降到64K,32K,甚至16K时,也不能避免丢失少量字节数据. 丢失数据的情况只在两个缓冲区间发生,而缓冲区内不发生丢失数据的情况.如我将缓冲区设为8M,在8M内数据完整不丢失,但在当前8M和下一个8M数据之间就会丢失约4-16字节数据. 测试程序时使用设备发送一长为2047比特的m序列. (本人怀疑:在采集卡双缓冲切换时,有时无法抢占电脑设备资源[如DMA],而PCI-7200的板上缓冲只有16字节,造成短时间内数据无法传输,丢失数据) (本设备不宜使用应答方式工作.) 2. 本人在程序中使用Sleep()函数是为了减少对CPU的使用率.因为程序中使用的用户缓冲区为512K字节,时钟为256KHZ,写满一个缓冲区要0.25秒,1毫秒检查一次缓冲区应该不会造成数据丢失. 3. 请问PCI-7200是否能一年365天24小时长时稳定的对外部时钟为1MHZ的时钟设备进行采样工作?

李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2002-08-26 14:22:00
3楼
更据你的描述,还是建议你用PCI-7300。

lyllzx

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年8月17日
发表于:2002-08-27 00:59:00
4楼
PCI-7300当然没有问题,我才用过。我不明白PCI-7200能干什么?它的指标不是12MB/S? PCI-7200和PCI-7300价格相差很多,不是简单替换的问题。我认为PCI-7200丢数据不是FIFO太小的原因,而是设计上存在问题。

李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2002-08-27 15:05:00
5楼
PCI-7200做的比较早(亚洲第一片PCI总线高速IO卡),很多地方考虑的不周到。PCI-7200的12MB/s是指一次DMA的最高数据流量。如果用Double buffer方式的话,由于PCI-7200的FIFO太小,在高速的情况下会出现丢数的现象。

lyllzx

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年8月17日
发表于:2002-08-29 23:57:00
6楼
李版主: 谢谢你的回复! 关于“在高速的情况下会出现丢数的现象”的回复: 请注意我的第一次回复有这样的描述“外部设备时钟为256KHZ时(这时数据为1MB/S),丢失数据的情况经常发生,每次丢失4-16字节数据,将外部设备的时钟降为128K时,丢失数据的情况大为减少,但是在有其它程序运行时就又频繁丢失数据,如边运行杀毒程序扫描电脑硬盘边采集数据,这时丢失数据字节的情况就比较严重.在时钟降到64K,32K,甚至16K时,也不能避免丢失少量字节数据.” 更低的速率没有测试,我认为以上速率应该不算高速。

李侃

  • 精华:22帖
  • 求助:0帖
  • 帖子:30帖 | 813回
  • 年度积分:0
  • 历史总积分:1015
  • 注册:2002年2月27日
发表于:2002-08-30 09:36:00
7楼
我3年前测试过,如果不用double buffer 方式,PCI-7200在8MB/s的流量下也不会发生丢数的现象。我们有一个客户用PCI-7200做软无线电台使用,用double buffer 方式,在小于1MB/s数据流量下不会出现丢数的现象。后来需要用到7MB/s数据流量,只能换成PCI-7300。

lyllzx

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2002年8月17日
发表于:2002-08-30 23:03:00
8楼
李版主:您好! 您说的不错,不用double buffer 方式,PCI-7200在8MB/s的流量下也不会发生丢数的现象,但这无法实现连续数据采集,所谓连续数据采集,就是只要不人为停止采集,采集卡就一直工作。我们 用16K外时钟(数据流量为512Kbit/s,即64KB/S)测试,如边运行杀毒程序扫描电脑硬盘边采集数据工作(采集数据时计算机肯定要做其他运算,否则就是单纯采集数据记盘了),连续采集2GB数据 也不能避免丢失少量字节数据。

热门招聘
相关主题

官方公众号

智造工程师