LabWindows原创教程
更新时间:2024-07-03 16:45:01 阅读量: 综合文库 文档下载
[原创教程]LabWindows/CVI入门之第一章:LabWindows/CVI开发环境
(2013-03-26 21:09:09) 转载标签: 杂谈
▼
1.1 LabWindows/CVI
1.1.1 LabWindows/CVI概述
LabWindows/CVI是美国NI(National Instruments)公司开发的面向计算机测控领域的虚拟仪器软件开发平台,可以在多种操作系统(WindowsXP/Vista/7、Mac OS和Unix)下运行。
LabWindows/CVI 是为C 语言程序员提供的集成开发环境(IDE),在此开发环境中可以利用C语言及其提供的库函数来实现程序的设计、编辑、编译、链接、调试。使用LabWindows/CVI 可以完成以下但不限于以下工作: ·交互式的程序开发;
·具有功能强大的函数库,用来创建数据采集和仪器控制的应用程序; ·充分利用完备的软件工具进行数据采集、分析和显示; ·利用向导开发IVI 仪器驱动程序和创建ActiveX 服务器; ·为其它程序开发C 目标模块、动态连接库(DLL)、C 语言库。
图 1?1 LabWindows/CVI界面
LabWindows/CVI 的功能强大在于它提供了丰富的函数库。利用这些库函数除可实现常规的程序设计外,还可实现更加复杂的数据采集和仪器控制系统的开发。
数据采集。IVI库、GPIB/GPIB 488.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?1 LabWindows/CVI主要目录及其内容
目录名 \\bin \\extlib \\fonts \\include \\instr \\samples \\sdk \\toolslib \\tutorial \\vxd \\wizard 说明 LabWindows/CVI的库文件 外部编译器使用的CVI库文件(只在Windows95/NT中使用) 字体文件 头文件 仪器模块 CVI开发例程 SDK库文件(只在Windows95/NT中使用) 开发工具包和库文件 使用手册 VXD实例开发模板 CVI开发环境中的向导程序 其中,samples文件夹中的例程可以使初学者迅速掌握CVI编程开发基本步骤。bin文件夹下的cvi.chm(也可以通过CVI开发环境中按F1打开)是学习CVI之路必不可少的参考文档。
1.2 寻根问底:开发环境
对于一门学问的初学者来说,最希望搞懂的就是学的东西的本质是什么。在前一小节中我们提到了,LabWindows/CVI是NI推出的一个基于C语言的集成开发环境(IDE,Integrated Development Environment)。那么什么是开发环境呢,开发环境是怎么工作的呢? 集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环
境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列,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安装路径下的“VC98\\Bin\\”文件夹下。
启动命令行窗口,并将地址修改为当前地址
(2)敲入cl.exe main.c命令执行编译。
中是否也能正确的运行。
其实,CVI是支持ANSI C(American National Standards Institute,美国国家标准协会)的,只要是ANSI C的代码,在CVI中一样可以运行。 1.4.2 阅读官方的samples
学习或提升一门编程语言的水平,最快速有效的是阅读大量优质的代码。NI在CVI安装目录的samples下提供了大量的参考例程。大家可以将samples例程中的.cws文件拖动到CVI中打开.cws文件,运行并查看官方的代码。
初次接触CVI的同学可能对CVI的“工作空间”与“工程”并不熟悉。一个工作空间中可能存在一个或多个工程。
CVI每次编译的时候一般只对“当前”工程进行编译。需要注意的是当前工程不是指的当前打开的文件所在的工程,而是被设置为“Active Project”的工程。设置一个工程为当前工程,可以通过右击工程-Set Active Project来完成,被设置为当前工程的工程名会被加粗显示,如下图所示。
图 1?8 被设置为当前工程的Rtfileio
CVI也可以批量编译,即同时对一个工作空间下的多个工程进行编译。批量编译可以通
过菜单Build-Batch Build?来实现。
1.5 探索与实验
1.5.1 实验
安装CVI开发环境,并实现类似图 1?2 CVI程序运行结果所示的应用程序,要求产生高斯噪声波形。 1.5.2 探索
通过查看NI帮助文档或查找资料,探究LabWindows/CVI的命令行编译方式。
[原创教程]LabWindows/CVI入门之第二章:GUI开发
(2013-03-26 21:09:58) 转载
▼
2.1 六步构建简单的GUI程序
在本节中,我们要做的例子很简单,是创建一个如下图所示的应用程序。
图 2?1 程序运行效果
2.1.1 创建工程文件
运行LabWindows/CVI,单击菜单File-New-Project(*.prj)?,将会出现新建工程的选项对话框。在对话框中可以选择是否同时新建一个工作空间,是否保持跟上个工程同样的配置。
图 2?2 创建新的工程
2.1.2 创建用户界面文件
单击菜单File-New-User Interface(*.uir)?,将会弹出用户界面编辑器。用户界面编辑器是一个利用交互式拖放控件的方法来设计图形用户界面的编辑器。对于一个新建的用户界面文件,编辑器将自动产生一个空面板,如下图所示。
图 2?3 用户界面编辑器窗口
双击面板,弹出属性编辑框。在属性编辑框中可以修改程序的标题、窗口位置、窗口按钮/菜单、窗口风格等特性。
图 2?4 属性编辑框
初始状态下,面板属性对话框的Callback Function(回调函数)留空。此处可以填写回调函数的名称(此示例填写“MainCallBack”),以方便后面添加窗口关闭、窗口激活或者失活的响应代码。
2.1.3 在用户界面文件中添加控件
在该窗口中Untitled Panel的灰色区域中单击鼠标右键,便会弹出一个如图 2?5所示的控件选择的快捷菜单。LabWindows/CVI 的控件种类见表 2?1。
图 2?5 控件菜单
从该菜单中选择所需的控件,并摆放到面板的适当位置(也可通过Create 菜单项来实现上述操作)。每个控件通过一系列属性设置对话框来设定,可以通过设置控件的属性来改变其外观、设置、热键和标签等。
在此,我们选择添加两个Numeric菜单下的Numeric控件,添加一个Text菜单下的String控件,Command Button菜单下的Square Command Button控件。添加完毕后,双击控件(或者右击-Edit Control)修改控件的相关属性。
分别在属性编辑框中,将两个Numeric控件的Constant Name属性修改为“PARA_A”、“PARA_B”,Label Appearance的Label属性修改为“参数A”、“参数B”。将String控件的Constant Name属性修改为“RESULT”,Label Appearance的Label属性修改为“A+B”。将Command Button控件的Constant Name属性修改为“CALCULATE”,Callback Function属性修改为“Calculate”,以方便后面生成回调函数。
图 2?6 修改控件的属性
当然,为了美观,可以在Quick Edit Window中修改按钮等控件的背景颜色,在Label Appearance中修改按钮中文字的颜色。上图中OK按钮即普通按钮修改颜色之后的效果。
2.1.4 生成框架源代码
在用户界面编辑窗口中,选择菜单Code-Generate-All Code,此时将会弹出一个提示存储.uir文件的对话框,在此我们存为1.uir(CVI将会生成同名的.h文件。不建议大家像示例一样起无意义的命名)。保存后CVI会弹出生成代码的对话框,一般情况下直接点击OK,框架源代码会自动保存在跟.uir同名的C文件中。
图 2?7 生成所有代码
至此,我们点击菜单Run-Debug Project之后,程序UI已经可以运行了。运行结果如下图所示。当然了,因为尚未编写按钮的回调函数的响应代码,此时点击任何按钮都不会执行对应的操作。
图 2?8 程序UI运行结果
2.1.5 添加回调函数
生成框架代码之后,我们应该可以在uir同名的C文件中看到CVI为我们生成了如下代码:
我们可以在CVI为我们生成的框架中添加或修改代码,以实现具体的功能。在添加或修改代码之前,我们先来逐一分析CVI生成的框架代码做了什么。
cvirte.h、userint.h分别是CVI运行时库(CVI Run-Time Engine)、CVI用户界面库(CVI User Interface)的头文件,分别包含了CVI框架运行、CVI用户界面运行所需要的基本函数的声明与定义。1.h是界面文件1.uir的头文件库,包含了界面中的控件的定义与声明。而panelHandle为面板的全局句柄,当对面板或者面板上的控件进行操作时经常用到。
main函数是用户程序运行时首先被执行的函数。main函数实现的功能分别是CVI运行引擎初始化(InitCVIRTE函数)、加载面板(LoadPanel函数)、显示面板(DisplayPanel函数)、开始消息队列循环(RunUserInterface函数)。其中RunUserInterface会不断的检
查面板的消息或者操作系统发送的消息,永远不会返回,除非用户主动调用
QuitUserInterface函数中止消息循环。所以,正常运行状态下,main函数中的DiscardPanel永远不会被执行,main函数永远不会退出,直到程序被关闭。
MainCallBack是我们在面板属性编辑框中填写的Callback Function的名字,负责执行主程序面板消息的响应代码。在switch语句中,我们可以看到,CVI已经事先为我们生成好了三个面板最常用的事件:EVENT_GOT_FOCUS、EVENT_LOST_FOCUS以及EVENT_CLOSE。分别在对应的case中添加代码,即可在窗口被激活、窗口失活、以及点击窗口右上角“关闭”按钮时执行的代码。
CVI初学者可能会被MainCallBack前面的从未见过的CVICALLBACK吓倒。其实我们只需要选中CVICALLBACK之后右击,选择Go To Defination即可看到:
CVICDECL仍然不是我们的C语言关键字。继续选中CVICDECL之后右击,选择Go To Defination查看CVICDECL的原型:
至此,CVICALLBACK真相大白。其实CVICALLBACK只是__cdecl的宏定义。什么?不懂
__cdecl是什么意思?赶紧拿起手中的手机,访问Google搞清楚它们的神奇功效吧! CVI初学者也可能被MainCallBack后面跟着的一堆参数吓倒,不知道他们是做何用,“不管他们行不行”。panel好理解,就是消息发生所在的面板的句柄。callbackData表示消息发出时所附带的数据。可是eventData1以及eventData2却容易让初学者云里雾里。其实我们只需要选中任意case语句中的事件(此处可以选择EVENT_GOT_FOCUS),右击选择Go To Defination之后即可发现,CVI User Interface的事件定义全在这里。对eventData1以及eventData2的说明,也在定义的注释中有所说明。
在此,为了让用户点击程序右上角的关闭按钮时,程序可以顺利关闭,在case EVENT_CLOSE语句后面添加QuitUserInterface函数:
Calculate函数是我们在面板中创建的按钮(Command Button)控件的消息响应函数,函数框架跟前面的主面板的消息响应函数类似。我们需要在此添加按钮按下之后需要执行的代码。Calculate函数添加响应之后的代码如下:
需要提醒大家的是,作为CVI的初学者,请在对照示例进行实际操作时,不要直接Copy+Paste上面的代码。自己对照着上面的代码一个字母一个字母的敲进去,会对扎实、
牢固的学习掌握CVI具有很大的帮助的。
GetCtrlVal是获取控件的当前值的函数,其函数声明如下:
其中value为控件的当前值变量的指针。panelHandle参数为函数面板的句柄,之前已经提到。可是控件的句柄controlID如何获得呢?
最简单的方法就是,控件的句柄即[控件所在的面板的Constant Name]_[控件的Constant Name]。若控件所在面板的Constant Name为PANEL,控件的Constant Name为NAME,那么控件的句柄即为PANEL_NAME。其中,面板或者控件的Constant Name都可以通过双击面板或者双击控件来进行设置。
另外一种方法即打开.uir同名的.h文件,查找对应的控件的定义。我们在1.h文件中发现如下代码:
即可得知,“参数A”控件的句柄为PANEL_PARA_A。 SetCtrlVal是设置控件的当前值的函数,其函数声明如下:
同GetCtrlVal一样,调用SetCtrlVal并填入面板、控件句柄之后即可设置控件的值。 GetCtrlVal、SetCtrlVal、GetCtrlAttribute以及SetCtrlAttribute四个函数,是对几乎所有控件都适用的函数,在CVI的GUI程序中,使用极其频繁,是学习CVI的GUI编程必须掌握的四个函数。
2.1.6 运行、调试
点击菜单Run-Debug Project(或点击工具栏的绿色三角形按钮)即可直接编译并运行当前工程,同时也可以在工程所在目录下生成exe文件。
右击工程名并选择Build(或点击菜单Build-Create Debuggable Executable)即可编译并生成exe文件。
在CVI代码编辑窗口中单击代码前空白部分或者按F9按键,则可以在对应的C语言语句处设置断点。
在程序中断时,单击菜单Window即可控制开启或关闭Memory(内存)、Variables(变量)、Watch(监控)窗口,通过查看或者修改对应的参数的值来方便的调试程序。 在本节中,我们已经通过编写并运行一个GUI的实例,了解了在CVI下用C语言开发GUI程序的基本过程。至此,大家已经算是对CVI入门了,大家已经可以尝试着自行开发一些有用、好玩的程序了。
2.2 借助帮助文档使用更多控件更多功能
一般软件在设计时都会遵循二八定律,即80%的人通常只使用一个软件20%的功能,但是另外80%的功能却对20%的人来说很重要。对于CVI初学者也一样,任何教程只会告诉初学者20%的功能如何去使用,而剩下的80%的功能只能由使用者根据CVI软件提供的帮助文档或者自行查找相关的资料来使用/实现。
授之以鱼不如授之以渔,下面我们将针对CVI初学者经常遇到的几个问题,提供解决问题的方法。
2.2.1 随心使用更丰富的CVI控件
CVI具有丰富的控件,从一般的按钮、界面到图表、开关。在使用CVI提供的丰富、强大的控件之前,我们必须先对CVI提供了哪些控件有一个大致的了解。 CVI控件的类型列举如表 2?1所示。
表 2?1 CVI的控件类型
数值型控件(Numeric) 命令按钮(Command Button) 指示灯(LED) 列表控件(Ring) 装饰控件(Decoration) 图片控件(Picture) 定时器控件(Timer) 文本型控件(Text ) 双态按钮(Toggle Button) 二值开关(Binary Switch) 列表框(List Box) 图形控件(Graph) 表格控件(Table) 画布控件(Canvas)
分隔线控件(Splitter) ActiveX控件(ActiveX) 自定义控件(Custom Controls) 标签页控件(Tab) 经典样式控件(Classic-Style?) 常用控件的功能如下:
(1)数值型(Numeric)控件可作为用户参数输入窗或程序参数回显窗; (2)字符串(Text )控件用来输入或显示一个字符串;
(3)文本型控件包括文本框控件(Text Box Control)和信息框控件(Text Message Control),用于显示大量的文本信息;
(4)命令按钮(Command Button)控件用于出发一个事件,用于仪器的控制。命令按钮一般必须定义回调函数功能的名称;
(5)双态按钮(Toggle Button)控件包括双态按钮、文本/图形双态按钮和单选/复选按钮,它们都有两种状态,分别为“0”和“1”。
(6)二值开关(Binary Switch)控件可以在两种状态(On/Off)下工作,并为两种状态设置控件值和标题,与触发按钮类似;
(7)列表(Ring)控件用于在一组值中进行选择,既可以用鼠标单击控件框或单击控件的上下箭头选择,也可以用键盘的Up和Down键来选择;
(8)时钟(Timer)控件用来设置特定的时间段内触发事件,它可以在无限长的时间里等间隔地重复执行给定的操作;
(9)图形(Graph)控件分为曲线图Graph控件和带状图Strip Charts控件。带状图用来实时显示图形数据。
(10)标签页(Tab)控件用来给程序添加多个可以切换的标签页。 (11)经典样式控件(Classic-Style?)罗列了早期版本中CVI的控件。 在.uir文件中添加控件之后,右击控件,都会弹出类似图 2?9所示的菜单:
图 2?9 右击控件弹出菜单
选择“Control Help”,则CVI会自动打开帮助文档的该控件的帮助部分。如图 2?10所示。点击Programming? Controls 链接即可查看操作该控件所需要的一些函数。
图 2?10 控件的帮助文档
2.2.2 使用丰富的CVI函数库
在第一章中,我们提到了CVI的强大之处在于它提供了丰富的函数库支持。利用CVI的库,我们可以轻松的实现数据采集、数据分析、GUI交互、通信以及多线程等功能。 如何使用CVI丰富的函数库呢?细心的同学可能已经注意到了,在CVI开发环境的左下角有一个Libraries Tree窗口(如图 2?11),提供了CVI提供的函数库(fp,Function Tree)的浏览功能。
图 2?11 CVI提供的函数库窗口
例如,若想实现以下弹窗(Popup)的功能。则可在函数库浏览窗口的User Interface Library中打开Pop-up Panels,然后在 Message/Prompt Popups中找到ConfirmPopup函数,右击该函数,选择Function Help,即可获得使用该函数的相关帮助。如果直接双击该函数,还会在右侧出现函数面板,辅助大家填写函数的参数。
图 2?12 确认是否关闭的弹窗
图 2?13 获得函数的帮助信息
一个典型的帮助窗口如所示。帮助窗口中一般具有该函数功能的简单描述,并且具有该函数的声明。
图 2?14 ConfirmPopup的帮助窗口
使用该帮助窗口足够满足一般情况的需求。但若想要寻求更加详细帮助文档,可以点击菜单Help-Contents,在“索引”中输入函数名,寻求更加详细的说明文档。
此外CVI还提供了其他丰富的函数库。CVI的函数库不光可以实现用户交互的操作,支持ANSI C,还支持以下诸多功能:
菜单创建、打印管理、绘图、剪切板操作、最小化到系统托盘、鼠标控制、按键检测、定时器、显示器兼容管理、信号生成、矩阵操作、复数运算、信号处理、信号测量、数据统
计、拟合、向量运算、字符串操作、文件操作、物理内存访问、任务管理、调用外部程序、多线程管理、调用外部模块管理、VXI通信、GPIB通信、RS232通信、VISA功能、TCP通信、访问Internet、直接数据访问控制、调用ActiveX控件、调用.Net功能、套接字通信等等等等。
2.2.3 获取丰富的CVI事件与用户交互
CVI应用程序是以事件来驱动的(事件驱动是指当事件发生后对应的代码才会被执行)。CVI中的事件有三种来源:用户操作引起的事件(如鼠标点击)、操作系统发送的事件(如定时器)、应用程序之间发送的或自己给自己发送的事件。
在2.1.5 添加回调函数中,我们已经初步接触了控件以及面板的事件。通过userint.h中对事件的宏定义我们可以知道CVI中有哪些事件,但是我们却无法知道面板此时正在发生的事件是什么。
用户界面文件编辑器就提供了方便我们查看面板当前发生的事件的查看器。当我们打开一个.uir文件时,在用户界面文件编辑器的上方有四个状态切换按钮(如所示)。从左到右分别是预览按钮、界面编辑按钮字体编辑按钮与背景编辑按钮。
图 2?15 uir文件的状态切换按钮
点击预览按钮,将状态切换到预览。此时,尝试鼠标或者键盘操作,在CVI的右上角(不同版本可能有所区别)会出现以“EVENT_”开头的字样,该字样即提示了当前发生的事件。 当知道了某种操作导致的事件之后,可以再次切换到界面编辑模式,右击该控件-View Control Callback则CVI会自动跳到该控件的回调函数中。若View Control Callback不可用,则双击该控件,给该控件添加回调函数(Callback Function)然后右击控件-Generate Control Callback后即可使用。
2.3 探索与实验
2.3.1 实验
设计虚拟信号发生器,如图 2?16所示。
图 2?16 虚拟信号发生器
功能描述及测试表格如表 2?2所示。
表 2?2 虚拟信号发生器测试表格
功能要求 波形选择 波形参数设置 偏移量设置 显示颜色设置 2.3.2 探究
测试要求 在三角波、正弦波、方波、任意波之间切换 设置采样率、频率、幅值 设置波形的偏移量 设置波形显示的颜色 探究在CVI下菜单创建、打印管理、绘图、剪切板操作、最小化到系统托盘、鼠标控制、按键检测、定时器、显示器兼容管理、信号生成、矩阵操作、复数运算、信号处理、信号测量、数据统计、拟合、向量运算、字符串操作、物理内存访问、任务管理、调用外部程序、多线程管理、调用外部模块管理等函数库的函数。
自己写iRunUserInterface函数,要求实现跟RunUserInterface函数完全
通过上一章节的学习,大家已经掌握了在CVI下开发GUI应用程序的基本步骤和基本方法。CVI的重要应用是工业接口通信、复杂的数据采集和仪器控制系统的开发,所以对于学习CVI来说仅仅掌握GUI程序的开发还远远不够。实际生产生活中,有些设备要求能够满足军用或工业领域恶劣环境或极端天气下对于可靠性的要求,有些设备要求能够满足快速大容量数据的持续传输的要求,有些设备要求能够满足防尘防水防暴防震防撬的要求,有些设备要求满足低成本的要求,纷繁的要求导致了不同的接口标准以及接口协议的诞生。
仅仅掌握了CVI下GUI的编程只能说是对CVI入门,却没有充分的体会到CVI的精华。在纷繁的接口与个性化的需求下,开发简捷高效、稳定易用、用户体验良好的程序才是我们学习CVI的终极目标。
[原创教程]LabWindows/CVI入门之第三章:计算机外设开发
3.1 计算机组件编程
在本节中,我们将会接触到在CVI下进行文件操作、音频播放、OpenGL操作、SQL数据库查询、剪贴板操作、动态数据交换、ActiveX控件操作、调用.Net操作等相关内容。在介绍相关内容时,我们只介绍原理与CVI对应的函数功能,具体使用方法需要大家查询CVI的帮助文档。
3.1.1 在CVI中进行文件操作
在程序运行时,常常需要将一些数据(运行的最终结果或中间数据)输出到磁盘上存放起来,以后需要时再从磁盘中输入到计算机内存。这样就需要对文件进行读写操作,LabWindows/CVI中对文件读写操作的常用函数如下:
(1) OpenFile 打开一个文件用以读或者写,函数返回文件句柄; (2) CloseFile 关闭指定的文件;
(3) ReadFile 从文件中读取指定字节数的内容到字符串缓冲区; (4) WriteFile 将字符串缓冲区中指定字节数的内容写到文件中; (5) ArrayToFile 将数组内容保存到文件中; (6) FileToArray 从文件中读取数据存储到数组中。
(7) ReadLine 从文件读取字节直到换行。
(8) WriteLine 将缓冲区中指定的字节数写入文件中,同时换行。 (9) DeleteFile 删除文件 (10) RenameFile 重命名文件 (11) CopyFile 复制文件
下面给出了一个简单的新建test.txt文件,并且向文本文件中写入字符并读出来的例子。
该函数运行之后,将在工程文件夹下新建一test.txt的文本文件,文件内容如图 3?1所示。程序运行结果如图 3?2所示。
图 3?1 文本文件内容
图 3?2 程序运行结果
与文件读写有关的函数可以在Formatting and I/O Library的File I/O中找到,与文件操作有关的函数可以在Utility Library的File Utilities中找到,与文件夹有关的函数可以在Utility Library的Directory Utilities中找到。另外,ANSI C中对文件的操作的函数如fopen、fread、fputs等函数在CVI中仍然可以使用。
3.1.2 网络通信:在
CVI中调用TCP库
在测控领域,随着网络计算、远程监控与远程诊断等在仪器仪表领域的应用与发展,网络通信已经成为仪器的基本功能。CVI也提供了Internet库、TCP库、DataSocket库以供用户使用。
Internet库主要提供了FTP协议、Telnet协议以及POP3协议的客户端的函数支持。 TCP库主要提供了基于TCP协议的网络数据收发函数。
DataSocket库提供了比TCP更加方便有效的NI推出的DataSocket的操作函数。 在本小节的介绍之前,我们假设大家已经知道了TCP/IP协议、FTP协议、POP3协议、HTTP协议、Telnet协议以及他们之间的相互关系,知道了IP地址、子网掩码、DNS、网关是什么。若对以上问题有含糊之处,建议立即通过Google等手段理解这些概念。 本节主要介绍TCP通信的相关内容。
利用TCP函数库进行网络传输都要涉及服务器端和客户端。TCP服务器可以通过网络向用户应用程序发送数据和从客户应用程序接收数据。TCP客户可以向TCP服务应用程序发送连接请求,并从服务器接收数据和向服务器发送数据。服务器需要注册,注册以后等待客户向它发送连接请求,而客户只能向已经存在的服务器发送连接请求。运行TCP服务器应用程序的计算机一般叫做主机。服务器端的传输控制函数如下: (1) RegisterTCPServer 注册TCP服务器 (2) ServerTCPRead 从客户端读取数据
(3) ServerTCPWrite 向客户端发送数据 (4) UnregisterTCPServer 注销TCP服务器 (5) DisconnectTCPClient 断开与客户端的连接
要是程序成为TCP服务器,必须要运行RegisterTCPServer函数。客户端的传输控制函数如下:
(1) ConnectToTCPServer 连接到TCP服务器 (2) ClientTCPServer 从服务器读取数据 (3) ClientTCPWrite 向服务器写数据
(4) DisconnectFromTCPServer 断开与TCP服务器的连接
另外CVI的TCP库还提供了TCP的回调函数,并提供了连接开始(TCO_CONNECT)、断开连接(TCP_DISCONNECT)以及数据有效(TCP_DATAREADY)3种消息。
下面给出了一个简单的建立TCP服务器,并通过客户端连接TCP服务器的例子。在该示例程序中,TCP服务器运行后客户端向服务器发送“Hello,I'm client.”的文本信息,服务器向客户端返回“OK”信息。 TCP服务器代码如下:
TCP客户端的代码如下:
TCP服务器与TCP客户端的程序分别保存在两个不同的工程中。运行时,先运行TCP服务器程序,再运行TCP客户端程序,运行效果如所示。
图 3?3 TCP示例程序运行结果
3.1.3 网络通信:在
CVI中调用Internet库
Internet库主要提供了FTP协议、Telnet协议以及POP3协议的客户端的函数支持。 FTP是应用层的协议,它基于TCP协议,负责进行文件的传输。CVI通过封装隐藏了一些底层的FTP操作,提供了两个方便的FTP操作函数:
(1) InetFTPAutoSend 将本地的文件传输到指定的远程服务器主机上 (2) InetFTPAutoRetrieve 将指定远程服务器上的文件传输到本机上。
Telnet协议也是应用层的协议,同样基于TCP协议,是Internet远程登陆服务的标准协议和主要方式。CVI提供了对Telnet操作的以下函数: (1) InetTelnetOpen 建立Telnet连接
(2) InetTelnetRead 从Telnet服务器中读取数据 (3) InetTelnetWrite 向Telnet服务器写数据 (4) InetTelnetClose 关闭Telnet连接
(5) InetTelnetReadUntil 从Telnet服务器中读取数据,直到遇到指定字符或达到指定字节数或者超时
(6)InetTelnetRunScript 在Telnet服务器上执行指定的脚本
POP3也是应用层的协议,基于TCP协议,规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件。POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件。CVI提供了对POP3操作的以
下函数:
(1) InetPop3Open 连接POP3服务器
(2) InetPop3Close 关闭与POP3服务器的连接
(3) InetPop3GetNumMessages 获取POP3服务器上的消息数量 (4) InetPop3GetMessageSize 获取POP3服务器上消息的大小 (5) InetPop3GetMessageInfo 获取POP3服务器上邮件的具体信息 (6) InetPop3DeleteMessage 删除POP3服务器上的消息 (7) InetPop3GetMessage 获取POP3电子邮件消息头与内容 (8) InetPop3ParseMessageHeader 解析POP3邮件的消息头
3.1.4 网络通信:在
CVI中调用DataSocket库
DataSocket技术是NI公司推出的面向测控领域的网络通信技术。DataSocket技术基于Microsoft的COM和ActiveX技术,对TCP/IP协议进行高度封装,面向测量和自动化应用,用于共享和发布实时数据DamSockd能有效地支持本地计算机上不同应用程序对特定数据的同时应用,以及网络和不同计算机的多个应用程序之间的数据交互,实现跨机器、跨语言、跨进程实时数据共享。
在测试测量过程中,用户只需要知道数据源和数据库及需要交换的数据就可以直接进行高层应用程序的开发,实现高速数据传输,而不必关心底层的实现细节,从而简化通信程序的编写过程、提高编程效率。
DataSocket包括DataSocket Server Manager(以下简称Manager),DataSocket Server和DataSocket API一部分。
Manager是一个独立运行的程序,主要功能有:设置DataSocket Server连接的客户端程序的最大数目和创建数据项的最大数目:创建用户组和用户;设置用户创建和读写数据项的权限;限制身份不明的客户对服务器进行访问和攻击。例如,将Manager中的Default Reader设置为everyhost,则网中的每台客户计算机都可以读取服务器上的数据。Manager对DataSocket Server 的配置必须在本地计算机上进行,而不能远程配置或通过运行程序来配置。
DataSocket Server 是一个必须运行在服务器端的程序,负责监管Manager中所设定的
正在阅读:
LabWindows原创教程07-03
购买汽车类驾驶人考试服务实施细则07-05
描写故宫的作文02-05
江苏省东台市富安镇丁庄中学2016届九年级语文上学期第二次质量检07-04
急性ST段抬高型心肌梗死(精)03-16
甬统表(2015版)A表06-22
中外合作经营合同范本(中英)07-09
自控原理实验任务书07-10
高中英语听力教学现状分析与实施策略03-08
- 天大砼方案 - 图文
- 农业科技网络书屋能力提升_玉米错题选
- DNS习题
- 浅议检察官对罪犯谈话的技巧与效果
- 高考语文文言文翻译专题训练
- AB类学科竞赛目录(2015)
- 建筑面积计算新规定(2015最新)
- Revit2012初级工程师题集一
- 十三五项目米线可行性报告
- 2013体育学院党组织建设工作总结
- 2014Revit工程师题库
- 高中数学如何实施研究性学习
- 茶艺表演 中英互译
- 小学音乐湘文艺版 四年级下册 第十一课《(歌表演)脚印》优质课公
- 山西省农村合作经济承包合同管理条例
- 2015年镇江市中考化学一模试题参考答案及评分标准(定稿)
- 统计 题集
- 批评意见清单
- 8潞安集团蒲县黑龙关煤矿矿业公司2
- 鄂教版四年级语文上册复习精要(光谷四小)
- LabWindows
- 教程
- 原创
- 环保协议书
- 1000A智能型万能式断路器设计-毕业设计
- (新课标)2016高考英语短文语法填空和阅读一轮选练(1)
- 操作系统论文
- 火车站站前广场建设项目可行性研究报告
- 高平路、杭州路、新区大道施工组织设计
- 山东省兖州一中2013届高三上学期期中考试数学(文)试题
- 数字信号处理期末试卷(含答案)全
- 12.2(2)平方根和开平方
- 小缸径多缸增压柴油机发展综述
- 专科《城市管理学》_试卷_答案
- 2014年浙江省宁波市中考数学试题(含答案)
- 党建征文模板 - 党旗飘飘
- SBDART辐射传输模式的输入
- 训前调研问卷
- 2010-2011学年新人教版七年级(上)期中数学试题B卷
- 建筑工程计量与计价
- 小学三年级数学应用题大全
- 教科版小学五年级上册《品德与社会》全册教案1
- 16道餐厅中常被点的家常菜做法 - 图文