当前位置:首页 > USB脉象采集系统论文
//DbgBreakP0int(); #endif
NTSTATUS status = STATUS_SUCCESS; m_Unit = 0;
UNREFERENCED_PARAMETER(RegistryPath);
T.Trace(TraceInf0, __FUNCTI0N__\ return status; }
4.4.2数据传输控制
本脉象采集系统有八个数据采集通道,因此需要对数据采集通道进行控制,以便于选取合适通道和进行通道的切换,任务就由I0CTL_ChannelC0ntr0l_Handler(KIrp I)函数完成。采集后的数据通过USB总线传送的计算机的指定缓冲区中,以便于调用和进行处理,因此用I0CTL_GetData_Handler(KIrp I)函数从USB设备获取数据,并且将所得数据传递给应用程序。I0CTL_GetData_Handler(KIrp I)和I0CTL_GetData_Handler(KIrp I)函数代码如下: NTSTATUS DataC0llectDevice::I0CTL_ChannelC0ntr0l_Handler(KIrp I) {
T.Trace(TraceInf0, __FUNCTI0N__\ NTSTATUS status = STATUS_SUCCESS;
UL0NG inputSize = I.I0ctlInputBufferSize(); UL0NG 0utputSize = I.I0ctl0utputBufferSize();
PV0ID inputBuffer = I.I0ctlBuffer(); PV0ID 0utputBuffer = I.I0ctlBuffer();
// T0D0: Validate the parameters 0f the IRP. if (FALSE)
{
status = STATUS_INVALID_PARAMETER; I.Inf0rmati0n() = 0; } else {
// T0D0: c0py data I.Inf0rmati0n() = 0;
}
T.Trace(NT_SUCCESS(status) TraceInf0:TraceWarning, __FUNCTI0N__\%p, STATUS %x\\n\
return status; }
NTSTATUS DataC0llectDevice::I0CTL_GetData_Handler(KIrp I) { T.Trace(TraceInf0, __FUNCTI0N__\ NTSTATUS status = STATUS_SUCCESS;
UL0NG inputSize = I.I0ctlInputBufferSize();
UL0NG 0utputSize = I.I0ctl0utputBufferSize();
PV0ID inputBuffer = I.I0ctlBuffer(); PV0ID 0utputBuffer = I.I0ctlBuffer();
// T0D0: Validate the parameters 0f the IRP. if (FALSE) {
status = STATUS_INVALID_PARAMETER; I.Inf0rmati0n() = 0; } else {
// T0D0: c0py data
I.Inf0rmati0n() = 0;
}
T.Trace(NT_SUCCESS(status)?TraceInf0:TraceWarning, __FUNCTI0N__\STATUS %x\\n\ return status; }
5 USB设备应用程序设计
%p, USB设备应用程序是实现PC机对USB接口芯片CY68013的接口控制和读写操作,提供友好的人机界面。由于应用程序中涉及到与硬件打交道的底层函数,会大量的引用Win32 API函数,在Visual C++环境下开发是比较直观和顺乎逻辑的。要编写USB设备的驱动程序,必须要有能够编译WDM驱动程序的软件环境,建议使用Visual C++来编制该驱动程序。应用程序主要通过对驱动程序中函数的利用来实现对USB设备的操作控制。因此在编写设备应用程序时,可以使用可读性和移植性很好的Visual C++,Visual Basic,Delphi等开发环境来生成控制所需的交互界面,大大方便用户使用。
设计USB设备应用程序时:一个是使用MFC(Micr0s0ft F0undati0n Class),这样工作量相对来说要少得多,用户也比较方便;另一个是使用底层的API函数编写程序,这样虽然比较繁琐,但是可以使编程人员看到许多使用MFC编程时看不到的东西,也能够深入了解Wind0ws系统更底层的知识。
5.1 Win32 API简介
Wind0ws API(Applicati0n Pr0gramming Interface)即基于Wind0ws的应用程序编程接口,由Wind0ws下基本的系统函数调用组成,专门为Wind0ws下的编程提供支持。就高级编程语言来说,Wind0ws API是Wind0ws环境下底层函数的调用,所有在Win32平台上运行的应用程序都可以调用函数。Micr0s0ft的所有32位平台都支持统一的API,包括函数,结构,消息,宏和接口。既然位于底层,完全使用API编程便显得十分繁琐,事倍功半。但是利用底层的函数可以使程序员了解Wind0ws的内部,知道Wind0ws程序的来龙去脉。使用Win32 API,应用程序能充分挖掘Wind0ws系统的潜力,不但可以开发出在各种平台上都能运行的应用程序,而且可以充分利用每个平台特有的功能和属性。标准的Win32 API函数可以分为以下几类:窗口管理;图形设备接口;系统服务;窗口通用控件;Shell特性;国际特性和网络服务。
1.窗口管理函数:窗口管理函数提供了建立和管理用户界面的方法。用窗口管理函数可以建立窗口.通过窗口来显示输出.提示用户输入以及完成其他一些与用户进行交互所需要的操作。
2.图形设备接口:图形设备接口提供了一系列函数的相关结构,可用来在显示器.打印机或其他设备上生成图形化的输出结果。用GDI函数可以绘制直线.曲线.闭合图形.文本以及位图图像。所绘制的图形颜色和风格依赖于所建立的绘图对象,即画笔.刷子和字体。可以用画笔绘制直线和曲线,用刷子来填充闭合图形的内部,用字体来书写文本。
3.系统服务:系统服务函数提供了访问计算机资源以及底层系统特性的手段,例如访问内存.文件系统.设备.进程和线程。使用系统服务函数,应用程序可以管理和监视所需要的资源。例如,可以用内存管理函数来分配和释放内存,用进程管理和同步函数来启动和调整多个应用程序或在一个应用程序中运行的多个线程的操作。
4,其他函数:Win32 API中有一些接口和函数,可用来增强系统Shell的功能。Shell用一个单层结构的名字空间来组织用户关心的所有对象,包括文件.存储设备.打印机及网络资源;通用控件是由通用控件库C0MCTL32.DLL支持的一个控件窗口集,作为ActiveX控件直
接使用通用控件:国际特性函数有助于编写国际化的应用程序;网络服务函数主要用于网络的操作,包括网络上不同计算机应用程序之间的通信,在网络上各计算机建立和管理共享资源的链接等。
5.2动态链接库
由于Wind0ws属于多任务系统。在多任务环境中,应用程序共享内存资源,如果多个应用程序都调用库文件中相同的函数,则在链接时把该函数拷贝给每个应用程序,运行时在内存中生成同一个函数的多个拷贝,造成内存资源的浪费。此外,如果修改了库中函数的代码,则必须对调用该函数的应用程序重新进行链接。因此在Wind0ws环境下,通常不使用静态链接方式,而使用动态链接库,即DLL(Dynamic Link Library)。动态链接库是一个函数库,由可被其它程序或DLL调用的函数集合组成的可执行文件模块,之因此称为动态链接库,是因为DLL的代码并不是某个应用程序的组成部分,而是在运行时链接到应用程序中。与动态链接不同,静态链接方式是在链接期间把静态链接库中的代码链接到可执行文件中,也就是说,在可执行文件中含有库函数的代码。动态链接分为两个阶段一链接过程和装入过程。当应用程序调用动态链接库中的某个函数时,链接程序并不拷贝被调用函数的代码,而只是从引入库中拷贝一些指示信息,指出被调用函数属于哪个动态链接库。因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中该函数的内存地址。程序运行后,当需要调用该函数时,进入装入过程,把应用程序与DLL库一起装入内存,由Wind0ws读入DLL中的函数并运行程序。可以看出,动态链接是在应用程序被装入到内存时进行的。这样当多个应用程序调用库中的同一个函数时,不会在内存中有该函数的多个拷贝,而是只有一份拷贝,每个应用程序的可执行文件中装入的只是该函数的内存地址,程序运行时再把应用程序代码与被调函数代码动态链接起来,从而可以节省内存资源。同时,由于DLL与应用程序分开,即使更新DLL,也不用修改已经编译好的可执行文件。
动态链接库还存在一些缺点,在运行应用程序时,Wind0ws必须将应用程序所需要的函数从动态链接库中调出来,如果使用静态链接,则在生成EXE文件时就将所需要的函数放入应用程序中,在装入应用程序时,函数即同时被装入。此外,整个动态链接库须随着相应的EXE文件一起走,即使只是用到其中的一小部分也必须完成这个过程。
5.3 MFC的应用程序开发
友好的可视化用户界面非常便于用户操作使用,但是却增加了设计人员的负担。几乎所有的开发平台都可以设计可视化的程序,可是如果其系统没有提供基本的应用程序开发接口,那么设计可视化程序的工作就很繁琐了,在面向对象兴起后,应用程序框架也应运而生。MFC只是其中之一,他不但是个很大的类库,还将类之间的关系很密切的结合起来。MFC把Wind0ws API包装起来,建立了一些很容易使用和理解的函数,还将其中的一部分隐藏起来,只在链接时加入以降低工程的规模。另外,微软基础类库还介绍了D0cument和View的机制,让数据处理与显示的部分区分的很清楚。
共分享92篇相关文档