编辑: huangshuowei01 | 2017-09-24 |
第二章 使用纲要
第一节、使用上层用户函数,高效、简单 如果您只关心通道及频率等基本参数,而不必了解复杂的硬件知识和控制细节,那么我们强烈建议您使用 上层用户函数,它们就是几个简单的形如Win32 API的函数,具有相当的灵活性、可靠性和高效性.诸如 InitDeviceDI 、 InitDeviceDmaDI 、 ReadDeviceProDI_Npt 等.而底层用户函数如WriteRegisterULong 、 ReadRegisterULong、WritePortByte、ReadPortByte……则是满足了解硬件知识和控制细节、且又需要特殊复杂 控制的用户.但不管怎样,我们强烈建议您使用上层函数(在这些函数中,您见不到任何设备地址、寄存器端 口、中断号等物理信息,其复杂的控制细节完全封装在上层用户函数中. )对于上层用户函数的使用,您基本 上不必参考硬件说明书,除非您需要知道板上插座等管脚分配情况.
第二节、如何管理 PCI 设备 由于我们的驱动程序采用面向对象编程,所以要使用设备的一切功能,则必须首先用 CreateDevice函数创 建一个设备对象句柄hDevice,有了这个句柄,您就拥有了对该设备的绝对控制权.然后将此句柄作为参数传 递给相应的驱动函数,如InitDeviceDI可以使用hDevice句柄以程序查询方式初始化设备的DI部件, ReadDeviceProDI_Npt (或ReadDeviceProDI_Half)函数可以用hDevice句柄实现对DI数据的采样读取等.最后可 以通过 ReleaseDevice将hDevice释放掉.
第三节、如何用非空查询方式取得 DI 数据 当您有了hDevice设备对象句柄后, 便可用 InitDeviceDI函数初始化DI部件. 您只需要对这个pDIPara参数结 构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化.然后用 StartDeviceDI即可启动DI部件, 北京阿尔泰科技发展有限公司
3 开始DI采样,然后便可用 ReadDeviceProDI_Npt反复读取DI数据以实现连续不间断采样. 当您需要暂停设备时, 执行 StopDeviceDI,当您需要关闭DI设备时,ReleaseDevice便可帮您实现. (注:ReadDeviceProDI_Npt虽然主 要面对批量读取、高速连续采集而设计,但亦可用它以单点或几点的方式读取DI数据,以满足慢速、高实时性 采集需要) .具体执行流程请看下面的图 2.1.1.
第四节、如何用半满查询方式取得 DI 数据 当您有了hDevice设备对象句柄后, 便可用 InitDeviceDI函数初始化DI部件. 您只需要对这个pDIPara参数结 构体的各个成员简单赋值即可实现所有硬件参数和设备状态的初始化.然后用 StartDeviceDI即可启动DI部件, 开始DI采样,接着调用 GetDevStatusDI函数以查询DI的存储器FIFO的半满状态,如果达到半满状态,即可用 ReadDeviceProDI_Half函数读取一批半满长度(或半满以下)的DI数据,然后接着再查询FIFO的半满状态,若 有效再读取,就这样反复查询状态反复读取DI数据即可实现连续不间断采样.当您需要暂停设备时,执行 StopDeviceDI,当您需要关闭DI设备时,ReleaseDevice便可帮您实现. (注:ReadDeviceProDI_Half函数在半满 状态有效时也可以单点或几点的方式读取DI数据,只是到下一次半满信号到来时的时间间隔会变得非常短,而 不再是半满间隔. )具体执行流程请看下面的图 2.1.2.
第五节、如何用 Dma 直接内存方式取得 DI 数据 当您有了hDevice设备对象句柄后,便可用 InitDeviceDmaDI函数初始化DI部件,关于采样通道、频率等的 参数的设置是由这个函数的pDIPara参数结构体决定的.您只需要对这个pDIPara参数结构体的各个成员简单赋 值即可实现所有硬件参数和设备状态的初始化. 同时应调用 CreateSystemEvent函数创建一个内核事件对象句柄 hDmaEvent赋给 InitDeviceDmaDI的相应参数,它将作为Dma事件的变量.然后用 StartDeviceDmaDI即可启动 DI部件,开始DI采样,接着调用Win32 API函数WaitForSingleObject等待hDmaEvent事件的发生,当当前缓冲段 没有被DMA完成时,自动使所在线程进入睡眠状态(不消耗CPU时间) ,反之,则立即唤醒所在线程,执行它 下面的代码,此时您便可用 GetDevStatusDmaDI来确定哪一段缓冲是新的数据,即刻处理该数据,至到所有的 缓冲段变为旧数据段.然后再回到WaitForSingleObject,就这样反复读取DI数据即可实现连续不间断采样.当 您需要暂停设备时,执行 StopDeviceDmaDI,当您需要关闭DI设备时,ReleaseDeviceDmaDI便可帮您实现(但 设备对象hDevice依然存在) .具体执行流程请看图 2.1.3.