⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ac6112vc.cpp

📁 北京双诺公司的AC6112数据采集卡的开发源代码
💻 CPP
字号:
// ac6112app.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"

#include <conio.h>
#include "windows.h"    // 应加入的头文件
#include "winioctl.h"   // 应加入的头文件
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <winbase.h>

#include "ac6112inibyte.h"
//#include "Ac6112Deviceinterface.h"	// Has class GUID definition
//GUID ClassGuid = Ac6112Device_CLASS_GUID;

#include "ac6112.h"


	HINSTANCE hDLL;     //DLL句柄
	HANDLE hDevice=INVALID_HANDLE_VALUE;  //NT IO驱动 句柄--->暂定为全局变量,自定义时,可以自己传递参数

	unsigned long data[10000000];
// Global data
	unsigned long kBuffer[500000];

struct AC6112_STATE StateOf6112;

// Handle to device opened in driver.
//

struct AC6112_INI_BYTE buf[1];

int main(int argc, char* argv[])
{
	
	char *dll_name="ac6112.dll";//动态连接库名
	DWORD	Error;

	hDLL=LoadLibrary(dll_name); //调入DLL ,动态调用
	
	if(hDLL!=NULL){
		
		if((int)hDLL<31){
			printf("%s未找到!", dll_name);
		}else{
			printf("%s已调入。", dll_name);
		

#include "ac6112_func.h"
//-----------------------------------------------------------------
				//CHECK THE ALL FUNCTION IS EXIST
				if(AC6112_CreateDevice==NULL || AC6112_CloseDevice==NULL ||AC6112_INI==NULL||
					AC6112_CHN==NULL || AC6112_AD_MODE==NULL ||AC6112_AD_TIMER==NULL ||AC6112_RUN==NULL ||
					AC6112_STOP==NULL || AC6112_REW==NULL ||AC6112_READ_HARD_FIFO==NULL ||AC6112_READ_KFIFO==NULL ||
					AC6112_DA_MODE==NULL ||AC6112_DA0==NULL ||AC6112_DA1==NULL ||
					AC6112_IO_MODE==NULL ||AC6112_DI==NULL ||AC6112_DO==NULL ||
					AC6112_RCOUNTER==NULL ||AC6112_WCOUNTER==NULL ||AC6112_RTIMER==NULL ||
					AC6112_PROGRAM_TEST==NULL ||AC6112_TEST_HARDWARE==NULL)
				{
					printf("\nOne of function is not exist!\n");
						FreeLibrary(hDLL);//清DLL	
						exit(0);			
				}else{
					printf("\nAll of function is exist!\n");
				}

			hDevice=AC6112_CreateDevice( 0, &Error); //获取驱动句柄

				if(hDevice==INVALID_HANDLE_VALUE)
				{
					printf("The AC6112 Card  is not exist!!!\n");//未成功加载驱动
					getch();
				FreeLibrary(hDLL);//清DLL句柄
				
				exit(0);//退出
				}
				//指定的板卡存在,可进行操作

//--------- version test
				char uuu[1000];
			AC6112_Version(hDevice, uuu);
			printf("\n%s\n",uuu);
			getch();
//---------- test da ok
			puts("test DA\n");
			AC6112_DA_MODE(hDevice, 0);
			AC6112_DA0(hDevice, 0x8000);
			AC6112_DA1(hDevice, 0xfff0);
			getch();
//---------- test io ok
			unsigned long return_io_data=0;
			AC6112_IO_MODE(hDevice, 2);
			AC6112_DO(hDevice, 0x55aa);
			AC6112_DI(hDevice, &return_io_data);
			printf("\nDI=%x\n",return_io_data);
			getch();

//--------- test counter timer		
		puts("\n-----------Test AC 6112 Counter part.");

	AC6112_WCOUNTER(hDevice, 20000);
		//--模拟计数脉冲, test mode not for user
/*	for(int o=0;o<1000;o++){
		AC6112_IO_MODE(hDevice, 2);
		AC6112_IO_MODE(hDevice, 3);
	}
*/
	unsigned long return_counter_data=0;

	AC6112_RCOUNTER(hDevice, &return_counter_data);

	getch();
	printf("-----------Timer part!--------------\n");
	AC6112_WCOUNTER(hDevice, 2);
	
		//模拟10次脉冲发生, test mode not for user
/*		for(o=0; o<10;o++){
			AC6112_IO_MODE(hDevice, 2);
			AC6112_IO_MODE(hDevice, 3);
		}
*/		//读取定时器的数值,时基为1uS,每个计数相当于1uS
	unsigned long return_timer_data=0;
	AC6112_RTIMER(hDevice, &return_timer_data);
	printf("return timer data=%d\n", return_timer_data);
	
	getch();

//----------- test ad begin ---

	//设定参数
//---- 1简单查询法,可以在小数据量快速采集的情况下使用 -------- OK ----------

	//当用户希望快速采样小量数据(比如希望采集一个数据),可以通过判断非空标志进行采集
	//当启动AD采样后,发现AC6112 FIFO非空,说明至少采集了一个数据,即可读取,不必等待FIFO半满后才读取

		buf[0].Irq_Enable = 0;//禁止AC6112中断工作
		buf[0].kFifo_Notify_Length = 100000;//软件FIFO通知门限为100000采样点,此时该值无效
		buf[0].start_end_chn = 0;//起止通道为0
		buf[0].ad_mode = 0;//AD采样模式为0
		buf[0].da_mode = 0;//DA输出模式为0
		buf[0].ad_timer = 20;//AD采样时间定时器为10
		buf[0].Event_Enable = 0;//禁止使用事件通知
		buf[0].Event = NULL;//空事件句柄
		buf[0].EventFifoFull = NULL;//空事件句柄

		AC6112_INI(hDevice, buf);// 设置相关参数
unsigned long FifoHard[5096];	// ac6112 板载FIFO 
			AC6112_RUN(hDevice);//启动AD采样

		for(;;){
			do{
				AC6112_STATE(hDevice,&StateOf6112);//读AC6112状态(状态位的含义,请参考说明书)
			
				if((StateOf6112.HardwareState&4) == 0){//是否溢出
					printf("Fifo overflow\n");
					goto ppp;
				}
			}while((StateOf6112.HardwareState&1) != 1);//可根据FIFO状态进行选择(如,FIFO非空,FIFO半满,FIFO溢出)
		//读取AC6112板载FIFO中的数据,长度为1
		//(实际使用中,根据FIFO的状态的数据决定,长度从1-4096可选。
		//FIFO半满--可读2048个数据,FIFO溢出时--可读4096个数据,FIFO非空时--可读1个数据)
		//FIFO溢出时,只有单通道采样的数据有效;多通道的数据已经混乱,数据无效
			printf("%d\t",AC6112_READ_HARD_FIFO(hDevice, FifoHard,1));
			printf("%5d\tfifo state=%5d\n",FifoHard[0],(StateOf6112.HardwareState&7));//显示采样数据和FIFO状态
		
			if(kbhit() && getch() == 27)break;
		}
ppp:		AC6112_STOP(hDevice);  //溢出后停止采样
			puts("1111111111");
getch();
//-------	2中断+查询方法---适合大数据量采集,利用事件以外的方法	--OK ------------

		buf[0].Irq_Enable = 1;//允许AC6112中断工作
		buf[0].kFifo_Notify_Length = 100000;//软件FIFO通知门限为100000采样点,事件无效时该值无效
		buf[0].start_end_chn = 15<<5;//起止通道为0
		buf[0].ad_mode = 0;//AD采样模式为0
		buf[0].da_mode = 0;//DA输出模式为0
		buf[0].ad_timer = 20;//AD采样时间定时器为10
		buf[0].Event_Enable = 0;//禁止事件通知
		buf[0].Event = NULL;//空事件句柄
		buf[0].EventFifoFull = NULL;//空事件句柄
		
		AC6112_INI(hDevice, buf);// 设置相关参数
	
		AC6112_RUN(hDevice);//启动AD

		for(;;){
		
		AC6112_STATE(hDevice, &StateOf6112);//获得AC6112硬件状态,软件FIFO状态
		
		  if(StateOf6112.SoftFifoItemForRead >=100000){//判断软FIFO内的采样数据到100000

		AC6112_READ_KFIFO(hDevice, kBuffer, 100000);//从软FIFO中取采样数据,长度为100000个采样点

		//显示AC6112硬件FIFO状态,以及软件FIFO的状态
	printf("Ac6112fifo state=%X\nKFifo Capacity=%d\nKFifo for read=%d\nKFifo for write=%d\n", 
		StateOf6112.HardwareState,
		StateOf6112.SoftFifoCapacity, 
		StateOf6112.SoftFifoItemForRead , 
		StateOf6112.SoftFifoItemForWrite );

		for(int i=0; i<16; i++)	printf("%10d",kBuffer[i]);//显示采样数值
		  }
			if(kbhit() && getch() == 27)break;
//在本控制台程序中延缓100MS,以降低循环的负荷;
//在用户的图形界面程序中,可考虑在定时器中查询软FIFO状态
			::Sleep (100);
		}
	
	
	AC6112_STOP(hDevice);
	
//----------- test ad end
			AC6112_CloseDevice(hDevice);//关闭驱动程序
	}				 
	FreeLibrary(hDLL);//释放DLL句柄
	}
	getch();
	return 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -