📄 ac6112vc.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 + -