1.1 LabWindows/CVI
1.1.1 LabWindows/CVI概述
LabWindows/CVI是美国NI(NationalInstruments)公司开发的面向计算机测控领域的虚拟仪器软件开发平台,可以在多种操作系统(WindowsXP/Vista/7、MacOS和Unix)下运行。
LabWindows/CVI 是为C语言程序员提供的集成开发环境(IDE),在此开发环境中可以利用C语言及其提供的库函数来实现程序的设计、编辑、编译、链接、调试。使用LabWindows/CVI可以完成以下但不限于以下工作:
·交互式的程序开发;
·具有功能强大的函数库,用来创建数据采集和仪器控制的应用程序;
·充分利用完备的软件工具进行数据采集、分析和显示;
·利用向导开发IVI 仪器驱动程序和创建ActiveX 服务器;
·为其它程序开发C 目标模块、动态连接库(DLL)、C 语言库。
图 1‑1 LabWindows/CVI界面
LabWindows/CVI的功能强大在于它提供了丰富的函数库。利用这些库函数除可实现常规的程序设计外,还可实现更加复杂的数据采集和仪器控制系统的开发。
数据采集。IVI库、GPIB/GPIB488.2库、NI-DAQmx库、传统的NI-DAQ库、RS-232库、VISA库、VXI库以及NI-CAN库。
数据分析。格式化IO库、分析库以及可选的高级分析库。
GUI库。使用LabWindows/CVI的用户界面编辑器可以创建并编辑图形用户界面(GUI),而使用LabWindows/CVI的用户界面库函数可以在程序中创建并控制GUI。此外,LabWindows/CVI为GUI面板的设计,准备了许多专业控件,如:曲线图控件、带状图控件、表头、旋钮和指示灯等,以适应测控系统软件开发的需求,利用这些控件可以设计出专业的测控程序界面。
网络和进程间通信库。动态数据交换(DDE)库、TCP库、ActiveX库、Internet库、DIAdem连接库、DataSocket库等。
除此之外,用户可以在CVI中使用ANSI C库中的全部标准函数。
正式因为有了强大的库支持,所以在CVI中,完成绘制图 1‑2所示正弦函数波形的功能,只需要在main()函数中写三行代码:
图 1‑2 CVI程序运行结果
一旦提及NI公司,大家可能最先联想到的是NI公司推出的LabVIEW软件。LabWindows/CVI与LabVIEW相比,主要应用在各种测试、控制、故障分析及信息处理软件的开发中,其更适合中、大型复杂测试软件的开发,是工程技术人员开发建立监测系统、自动测量环境、数据采集系统、过程监测系统的首选工具。
1.1.2 LabWindows/CVI安装
要安装CVI,只需要根据CVI安装包里的“Release Notes.pdf”和“说明.txt”一步步完成安装即可。
安装完CVI后,我们有必要看一下,安装程序在我们计算机的磁盘中丢下了哪些东西。
表 1‑1LabWindows/CVI主要目录及其内容
目录名 | 说明 |
bin | LabWindows/CVI的库文件 |
extlib | 外部编译器使用的CVI库文件(只在Windows95/NT中使用) |
fonts | 字体文件 |
include | 头文件 |
instr | 仪器模块 |
samples | CVI开发例程 |
sdk | SDK库文件(只在Windows95/NT中使用) |
toolslib | 开发工具包和库文件 |
tutorial | 使用手册 |
vxd | VXD实例开发模板 |
wizard | CVI开发环境中的向导程序 |
其中,samples文件夹中的例程可以使初学者迅速掌握CVI编程开发基本步骤。bin文件夹下的cvi.chm(也可以通过CVI开发环境中按F1打开)是学习CVI之路必不可少的参考文档。
1.2 寻根问底:开发环境
对于一门学问的初学者来说,最希望搞懂的就是学的东西的本质是什么。在前一小节中我们提到了,LabWindows/CVI是NI推出的一个基于C语言的集成开发环境(IDE,IntegratedDevelopment Environment)。那么什么是开发环境呢,开发环境是怎么工作的呢?
集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的VisualStudio系列,Borland的C++ Builder系列等。
但我们自从学习C语言开始就与集成开发环境建立了不解之缘。似乎在我们心中,C语言就是VC/VS、VC/VS就是C语言、VC/VS就是编译器、编译器就是VC/VS。虽然不可否认的是,IDE的出现大大的降低了软件开发的门槛,曾经帮助我们快速入门,但IDE过于友好的界面让人无需思考程序编译、运行的原理即可开始写自己的第一个HelloWorld程序。
所以,我们有必要了解IDE的工作模式,有必要了解IDE是怎么通过命令行去工作的。命令行,看似简陋,却能让人专心于自己的事物,并搞清楚一个程序的来龙去脉。
Keil下的命令行工作方式已经在创新中心的《SST单片机实践教程》的“汇编语言工具链”一节中有了详细的介绍,下面通过一个实例介绍最常用的VC6.0的命令行工作方式。
在此之前,我们假设你至少已经用VC写过C语言,编译过工程,并对Windows下的命令行至少略知一二。当然,如果你现在还不懂,赶紧利用Google等一切现代化的工具解除自己的疑惑。
例1使用命令行完成用VC对下面简单的C语言程序的编译。
实验步骤
(1)将这段代码保存为.c文件(此处保存为main.c),并讲这段代码放在VC安装路径下的“VC98Bin”文件夹下。
启动命令行窗口,并将地址修改为当前地址
(2)敲入cl.exe main.c命令执行编译。
此时可能会弹出窗口,提示缺少文件“mspdb60.dll”,编译失败。毕竟当前的命令行窗口没有标准VC的环境变量,所以编译程序cl.exe无法从当前的环境变量中找到mspdb60.dll。
(3)在VC安装路径的“CommonMSDev98Bin”目录中找到此DLL并复制到“VC98Bin”文件夹下之后,按键盘方向键↑重新运行cl.exemain.c。此时会提示找不到stdio.h文件。在VC安装路径的“VC98Include”目录中找到stdio.h之后,复制到“VC98Bin”文件夹下。
图 1‑3命令行编译main.c-提示找不到stdio.h
(4)同理,程序会依次提示找不到文件LIBC.lib、OLDNAMES.lib、kernel32.lib。这些库文件都可以在VC安装目录下的“VC98Lib”路径中找到。
(5)再次运行,命令行提示编译成功。
图 1‑4 命令行编译main.c-编译成功
(6)在命令行中敲入main.exe。“Hello,world!”是否显示出来了呢?
图 1‑5 运行main.exe
至此,聪明的你应该已经知道VC的IDE是如何依赖于安装包内的编译器CL.exe程序实现编译的功能了吧。
本小节旨在通过对大家熟悉的VC的IDE改用命令行进行编译的方式引导大家接触一个新的事物首先应该搞清楚其本质的思想,养成搞学问时喜欢刨根问底的好习惯。除了编译器的功能外,集成开发环境IDE应该还带有调试器的功能。限于篇幅,此处不再多过多探索,大家可以自行研究。若对IDE感兴趣,大家还可以调用现有的编译器程序、调试器程序编写自己的IDE!
1.3 C语言的魅力
是不是在大家的印象里,C语言只能做那种char后面跟几个*,故意把人绕晕之后运行的时候还会弹出一个黑乎乎的窗口的程序?
是不是在大家的印象里,C语言不能访问网络、不能播放声音、不能显示图片、不能跟硬件设备打交道、不能做GUI,即便做出来GUI也丑的很或者慢的很,更不能搞多线程之类的高端一点的玩意儿?
是不是在大家的印象里,为了使用一个串口库,我们就必须丢掉C语言然后让C++甚至MFC闪亮登场?
是不是在大家的印象里,C语言能做的事情,C++、Java、C#或者Python等等编程语言通通都能做到?而这些编程语言能做到的事情C语言就很难做到?
如果一定要这么认为,那就大错特错了。即便在编程语言更新换代如此之快的今天,我们也很难找出一个智能设备或者商业软件在开发的过程中未曾使用C语言过。
借助CVI以及CVI自带的丰富的函数库,C语言不仅能够做C++、C#、Java等可以做的事,有时还可以做的更快更好,甚至还可以做这些编程语言所不能做的事。
我们学校(华中科技大学)的论坛“白云黄鹤”的服务器端程序就是采用C语言开发的,没有使用现成的Web服务程序或者数据库管理程序(当时没什么IIS也没MySQL可以用),因此数据库通过不断对文件进行fread或者fwrite实现的。
第一次听说C语言还可以用来开发服务器程序,大家肯定不敢相信。不过下面我们将以一个简单的实例来向大家证明,C语言真的可以写服务器端的程序,而且简单的超乎想象。
例2使用C语言完成简单的Web服务器的功能。
实验步骤
(1)若您的计算机尚未安装Apache,请先安装Apache服务器。若已安装Apache,请确保Apache程序处于运行状态。
(2)在VC6.0中新建C语言工程,输入以下代码。
(3)编译,并将编译后生成的可执行文件main.exe复制到Apache程序的cgi-bin目录下。
(4)在浏览器地址栏中输入http://localhost/cgi-bin/main.exe?HelloWorld
图 1‑6在浏览器中访问编译的程序并传入HelloWorld参数
是不是见识到了C语言在网络开发中“初见端倪”的一面?上述例子其实是CGI(Common GatewayInterface,通用网关接口)的一个最简单的例子。稍微详细一些的例子将会在第6章“综合实例:远程环境参数检测系统”中见到。如果你对C语言在开发CGI程序感兴趣,也可以自行查找资料,编写一个更具实际价值的网络应用程序。
1.4 CVI开发环境初接触
1.4.1 三步创建自己的Hello,world
不管是学习一门新的语言,还是学习一个新的开发工具,大家的第一个程序都是Helloworld。所以,下面我们一步一步来,实现我们的Hello,world!
1.建立/保存工程
运行LabWindows/CVI,初始状态的CVI会自动为我们建好一个新的工作空间Untitled.cws以及新的工程Untitled。.cws文件是CVI工作空间文件(CVIWorkSpace),而.prj(project)是CVI的工程文件。点击菜单File-New-Source(*.c),新建一个C文件。
图 1‑7 打开CVI并新建C文件
2.输入代码保存代码文件
在新建的C文件中输入下列代码,点击菜单File-SaveUntitled1.c(或者按Ctrl+S、或者点击工具栏中的保存按钮),将新建的C文件保存在自己想要保存的位置中。
3.编译运行
此时若点击菜单Run-DebugProject(或者点击工具栏中的绿色三角形按钮),则CVI会弹出如下所示提示。说明刚刚保存的C语言文件必须添加到一个工程中才能继续编译过程。此时点击Yes会自动将C文件添加到工程中,若点击Cancel也可以右击Untitled工程之后选择AddFile…添加C文件到工程中。
由于我们只保存了C文件,并未保存工程.prj文件,所以右击Untitled工程之后选择Save,将工程文件保存。
此时若再点击菜单Run-DebugProject(或者点击工具栏中的绿色三角形按钮),Hello,world成功运行!
总结起来,完成一个HelloWorld程序只需要“建立/保存工程”-“输入代码保存代码文件”-“编译运行”简单的三步。
大家若感兴趣,也可以将以前在VC中写的C语言程序代码复制到CVI中,看看在CVI中是否也能正确的运行。
其实,CVI是支持ANSI C(American National StandardsInstitute,美国国家标准协会)的,只要是ANSI C的代码,在CVI中一样可以运行。
1.4.2 阅读官方的samples
学习或提升一门编程语言的水平,最快速有效的是阅读大量优质的代码。NI在CVI安装目录的samples下提供了大量的参考例程。大家可以将samples例程中的.cws文件拖动到CVI中打开.cws文件,运行并查看官方的代码。
初次接触CVI的同学可能对CVI的“工作空间”与“工程”并不熟悉。一个工作空间中可能存在一个或多个工程。
CVI每次编译的时候一般只对“当前”工程进行编译。需要注意的是当前工程不是指的当前打开的文件所在的工程,而是被设置为“ActiveProject”的工程。设置一个工程为当前工程,可以通过右击工程-Set ActiveProject来完成,被设置为当前工程的工程名会被加粗显示,如下图所示。
图 1‑8 被设置为当前工程的Rtfileio
CVI也可以批量编译,即同时对一个工作空间下的多个工程进行编译。批量编译可以通过菜单Build-BatchBuild…来实现。
1.5 探索与实验
1.5.1 实验
安装CVI开发环境,并实现类似图 1‑2 CVI程序运行结果所示的应用程序,要求产生高斯噪声波形。
1.5.2 探索
通过查看NI帮助文档或查找资料,探究LabWindows/CVI的命令行编译方式。