关于ATS作业———利用LABWINDOWS/CVI显示波形并测量幅度、频率

0 题目与题目分析

设计带有波形显示和幅度,频率测量的测试应用程序。要求波形数据和测量数据来自uvats。提交测试后截图,波形显示代码截图,测量代码截图。

分析:题目要求实现三个功能——波形显示、幅度测量和频率测量,其中波形、幅度和频率都来自于DSO.所以我们需要通过VISA接口,用指令的方式从仪器获取相关的数据。由于需要通过GUI显示结果,前端我们需要Graph控件、Message控件和Button控件,分别用于显示波形,显示测量结果,控制GUI是否显示数据。由于在这里Graph控件画图和VISA通信耗时很久,如果我们使用单线程编程来完成这道题目的话,可以实现基本功能,但是GUI响应各种事件,比如单击、拖动窗口等事件,都会有不能忍受的延迟

下图为我的GUI效果图:
在这里插入图片描述
总结一下我们工程的架构:

  1. 数据来源为DSO,VISA和Sock32不能少;
  2. GUI需要Graph、Message(或其他可替代的控件)和Button;
  3. 一定要多线程(除非你可以忍受以秒为单位的响应延迟)。

另外:白嫖作业不是好习惯,本文的主要目的是点拨。有细节上的问题可以私聊我QQ.

1.从DSO接收数据

1.1 幅度数据

根据仪器编程手册,我们要获取到波形数据,需要用到的指令为:

:WAVeform:DATA?

这个简单,我们只需要通过相关的函数将这个命令发送给仪器就行了。

但是我们接受到的信息是怎样的呢?通过查询仪器编程手册,可以得到这样的结论:

<header><waveform_data><NL>

<header>表示帧头,<waveform_data>表示数据,<NL>则表示消息结束符(\n).

帧头里面包含了两个信息:1.仪器发送了多少数据;2.仪器发送的数据是多少字节的。
在这里插入图片描述
如上图,我们发送:WAV:DATA?指令收到的帧头是#41000,其中蕴藏的含义为:1.一个数据由4个byte构成,那么我们的每一个接收指针则需要指向至少32bit的内存。2.这一帧数据发送了1000个波形数据,那么我们需要用长度为1000的数组来装下这些数据头。所以我们需要接收两次,一次接收帧头(6个bit),一次接收数据。

在这里,每个波形数据传回来的数字并不是直接的电压值,而是和测量的电压值成倍数关系的很大的整数值(但我不知道这个整数的意义,一旦研究出这个整数是什么了,一定会第一时间告诉读者的),所以我们要乘上一个数,将这个大整数转换为电压。

Warning: 在这里,由于老师提供的uviScanf函数可能会引起General Protection的错误,所以在这里建议用uviRead函数来实现接收功能。

1.2 波形幅度和信号频率接收

根据仪器编程手册,获得幅度和频率的指令分别为:

:MEASure:VAMPlitude?
:MEASure:FREQuency?

由于发送这两个指令,仪器返回的都是单值,没有太大的执行难度,只要用%lf(双精度浮点)格式接收即可。

Warning:在这里建议用老师给的uviScanf函数接收.

2.多线程编程

多线程编程主要分为三个步骤

  1. 生成线程池;
  2. 调度线程函数;
  3. Discard线程池。(discard想不到好的翻译)

2.1 线程池的生成

在这里用到了这个函数:

int CVIFUNC  CmtNewThreadPool (int maxNumThreads, CmtThreadPoolHandle *poolHandle); 

第一个输入参数为线程池中最大的线程数,第二个输入参数为线程池句柄,这个句柄需要自己在代码中定义,其中CmtThreadPoolHandle可以替换为int。返回值为0则说明线程池创建成功。

e.g.

int pool_handle;
CmtNewThreadPool(3,&pool_handle);

2.2 线程函数调度

首先我们需要写好辅助线程函数,比如在本次作业中,我将绘制波形和仪器通信函数都放在了辅助线程中。由于辅助线程函数在运行完之后就不会被自动重新调用,所以我们需要把相关代码放在while(1)中。格式大致如下:

e.g.

int CVICALLBACK Thread1 ()
{
        //需要定义的变量
		while(1)
		{
		//相关操作...
        }
	return 0;
}

我们还需要告诉线程池,哪个函数是它需要调度的线程函数,在这里我们用到这个函数:

int CVIFUNC  CmtScheduleThreadPoolFunction 
(CmtThreadPoolHandle poolHandle, CmtThreadFunctionPtr threadFunction,
 void *threadFunctionData, CmtThreadFunctionID *threadFunctionID);

poolHandle即位线程池句柄,threadFunction为线程函数的函数名,threadFunctionData为函数的返回值传向的变量的指针,如果不关系返回值可以输入NULL,CmtThreadFunctionID为线程ID,在调用该函数之前定义即可,数据类型CmtThreadFunctionID依然可以用int替换。使用示例如下:

e.g.

int CVICALLBACK Thread1 ();

/*...*/

int pool_handle;
int thread_funcID;
CmtNewThreadPool(3,&pool_handle);
CmtScheduleThreadPoolFunction (pool_handle, Thread1, NULL, &thread_funcID); 

2.3 丢弃(Discard)线程

在结束程序的时候,同时也需要将线程池丢弃(没学过操作系统,要丢弃的原因是不是和打开文件后要关闭文件一样是为了把占用的内存释放?求解释)。

相关函数为:

int CVIFUNC CmtDiscardThreadPool (CmtThreadPoolHandle poolHandle); 

输入参数poolHandle为要丢弃的线程池的句柄。该函数在RunUserInterface()函数后面运行,即保证UIR关闭后,线程池也将被丢弃。

3.关于GUI

GUI是这次作业的三个部分中最简单的一个部分了,所以放在了最后一个讲,同时也不准备讲怎么用Graph、Button什么的,大家肯定都会,在这里讲点好玩点的。(这一部分在划水)

3.1 怎样更改GUI的图标(ICON)

用CVI打开你的工程文件,在Build选项卡中选择Target Setting.
在这里插入图片描述
然后在Application Icon File中,选择你希望修改为的图标文件,在这里我用pop子的头像作为图标。
在这里插入图片描述

Warning:在这里,必须用*.ico文件作为图标文件。百度上可以搜索到一些在线将图片文件转换为ico文件的网站,在这里就不细说了。

3.2 个性化你的标题栏

用CVI打开工程中的uir文件,在右侧边栏的PANEL的属性栏中的Title and Titlebar Appearance组中找到Title这一选项,将其修改为你希望你的GUI所拥有的标题名就行了。这里我就叫Eden’s GUI(不想动脑筋。在这里插入图片描述
同时,修改相关的属性设置,还可以让你的GUI尺寸不会发生改变,也可以禁用“最大化”按钮,让你的GUI变得更酷一点。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
LabWindows/CVI是一个强大的本地集成开发环境,专注于虚拟仪器测试技术和工程应用。它是由全球领先的测试与测量设备制造商National Instruments公司开发的,并在全球范围内广泛应用于各种行业的工程应用。 作为一种免费的开发环境,LabWindows/CVI为工程师们提供了一个灵活且易于使用的平台来开发虚拟仪器测试应用程序。它支持多种编程语言,包括C、C++和LabWindows/CVI自身的G语言,并提供了丰富的工具和库来简化开发过程。 虚拟仪器测试技术是一种利用计算机软件和硬件来模拟和实现传统仪器的测量和控制功能的方法。与传统的仪器相比,虚拟仪器测试技术具有更高的灵活性和可扩展性。通过LabWindows/CVI,工程师们可以轻松地构建和调试各种虚拟仪器测试应用,包括数据采集、信号生成、自动测试和控制系统等。 LabWindows/CVI还提供了丰富的工程应用库,包括各种数据处理、信号处理、图形显示和通讯工具等。这些库能够大大简化开发过程,并提高应用程序的性能和稳定性。此外,LabWindows/CVI还具有强大的调试和优化功能,能够帮助工程师在开发过程中更快地定位和解决问题。 总之,LabWindows/CVI虚拟仪器测试技术及工程应用免费,为工程师们提供了一个功能强大、易于使用的开发环境,帮助他们轻松构建各种虚拟仪器测试应用,并提高产品的质量和稳定性。无论是在学术研究、产品开发还是工业控制等领域,LabWindows/CVI都是一款值得信赖的工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值