VISA编程实例(C实现)

2023-05-16

    今天写这个文章,是因为自己工作中用到了ROHDE&SCHWARZ(即罗德-施瓦茨公司)的仪表设备,需要通过编程的方式来读取仪表上功率测试结果,本来仪表上显示了测试结果,不知道硬件部门为什么需要通过程序来获取?需求我是不明白的。

    既然要实现这个功能呢?自然就硬着头皮搞了,没想到,研究了几天,发现网上有这样的程序示例。

    先来说说做这个工作的必要的工具:

    1、电脑安装NIVISA1850这个工具。这个工具可以通过tcp的方式连接仪表,然后通过指令来获取相关的测试结果。其实这个工具在本文的例子中,它的作用是一个依赖,而不是用这个工具去查询功率结果,虽然通过这个工具可以查询到测量结果(measure result)。

    2、仪表:罗德施瓦茨 CMW500,这个工具只有懂的人或者用过的人才知道。

    

    3、本机安装vs2019。

    4、芯片板子,既然是测试功率,就需要其他的设备了,这个设备是公司硬件部门捣鼓的东西,他们需要测试GPS功率,就是通过射频发射信号(GPRF),然后连接仪表来测试。

 ==========================================================================

    开始试验:

    a 、开启仪表,仪表是一个windows xp系统,启动之后,设置测试功率相关参数,然后等待测试:

    b 、前面提到安装的第一个工具,nivisa,其实这个就是一个远程操作仪表的工具,安装之后,会有一个NI-MAX的工具,点击打开,选择左侧菜单,依次选择我的系统->设备和接口->网络设备->CMW "TCPIP0::192.168.253.13::inst0::INSTR":

   

    c 、然后选择面板上的“打开VISA测试面板”,会打开如下所示的面板:

    

    d 、切换到Input/Output:就可以通过命令来获取仪表信息了,如下所示:

    

     以上说了这么多,其实在我们c++编程里面,nivisa是一个依赖,我们需要他安装之后的头文件visa.h,还需要依赖库visa64.lib

    e 、在visual studio 2019中新建工程,编写如下代码:

#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "visa.h"

static ViSession defaultRM;
static ViSession instr;
static ViUInt32 retCount;
static ViUInt32 writeCount;
static ViStatus status;
static unsigned char buffer[100];
static char stringinput[512];


int main(void)
{

    status = viOpenDefaultRM(&defaultRM);
    if (status < VI_SUCCESS)
    {
        printf("Could not open a session to the VISA Resource Manager!\n");
        exit(EXIT_FAILURE);
    }

    //status = viOpen(defaultRM, "ASRL1::INSTR", VI_NULL, VI_NULL, &instr);
    status = viOpen(defaultRM, "TCPIP0::192.168.253.13::inst0::INSTR", VI_NULL, VI_NULL, &instr);
    if (status < VI_SUCCESS)
    {
        printf("Cannot open a session to the device.\n");
        goto Close;
    }

     /* Set the timeout to 5 seconds (5000 milliseconds). */
    status = viSetAttribute(instr, VI_ATTR_TMO_VALUE, 5000);

    /* Set the baud rate to 4800 (default is 9600). */
    status = viSetAttribute(instr, VI_ATTR_ASRL_BAUD, 4800);

    /* Set the number of data bits contained in each frame (from 5 to 8).
     * The data bits for  each frame are located in the low-order bits of
     * every byte stored in memory.
     */
    status = viSetAttribute(instr, VI_ATTR_ASRL_DATA_BITS, 8);

    status = viSetAttribute(instr, VI_ATTR_ASRL_PARITY, VI_ASRL_PAR_NONE);

    status = viSetAttribute(instr, VI_ATTR_ASRL_STOP_BITS, VI_ASRL_STOP_ONE);

    status = viSetAttribute(instr, VI_ATTR_TERMCHAR_EN, VI_TRUE);

    /* Set the termination character to 0xA
     */
    status = viSetAttribute(instr, VI_ATTR_TERMCHAR, 0xA);

    /* We will use the viWrite function to send the device the string "*IDN?\n",
     * asking for the device's identification.
    */
    //strcpy(stringinput, "*IDN?\n");
    strcpy(stringinput, "FETCh:GPRF:MEAS:POWer:PEAK:MAXimum?\n");
    status = viWrite(instr, (ViBuf)stringinput, (ViUInt32)strlen(stringinput), &writeCount);
    if (status < VI_SUCCESS){
        printf("Error writing to the device.\n");
        goto Close;
    }

    status = viRead(instr, buffer, 100, &retCount);
    if (status < VI_SUCCESS){
        printf("Error reading a response from the device.\n");
    }else{
        printf("\nData read: %*s\n", retCount, buffer);
    }

    /*
     * Now we will close the session to the instrument using
     * viClose. This operation frees all system resources.
     */
Close:
    status = viClose(instr);
    status = viClose(defaultRM);
    printf("Hit enter to continue.");
    fflush(stdin);
    getchar();

    return 0;
}

    关于这个程序来源呢,网上有,另外nivisa安装之后,有个目录:C:\Users\Public\Documents\National Instruments\NI-VISA\Examples\C,这里面都是一些c的代码,通过usb,serial,tcpip方式连接并且操作的代码都有。

    这个代码需要运行正确,需要对项目进行设置,主要是 VC++ Directories需要包含(Include Directories)visa.h所在的目录:

    C:\Program Files\IVI Foundation\VISA\Win64\Include

    库目录(Library Directories)要添加:

    C:\Program Files\IVI Foundation\VISA\Win64\Lib_x64

    还需要设置:链接(Link)->输入(Input),额外依赖(Additional Dependencies),添加:

    C:\Program Files\IVI Foundation\VISA\Win64\Lib_x64\msc\nivisa64.lib

    C:\Program Files\IVI Foundation\VISA\Win64\Lib_x64\msc\visa64.lib

    全部设置好了,项目不报错,编译通过,运行:

    f 、下面先给出仪表的显示结果:

     

    功率最大值Power Maximum是:23.878 dBm

    通过程序获取的结果:

    

    打印的结果是一个接近的数值,跟仪表结果类似,应该是仪表做了取舍。

    至此,通过visa编程,我们获取了仪表数据。这里我获取的是功率最大值,关于这个值,一般文档都是介绍的通过FETCh:GPRF:POWer:MAXimum:CURRent?获取,但是这个获取的是仪表上显示的Power Current Max的数值,我后来根据CMW_GPRF_UserManual文档找到了如下一些方法:

     

    后来试着用了FETCh:GPRF:MEAS:POWer:PEAK:MAXimum?来获取最大功率,竟然成功了,很高兴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VISA编程实例(C实现) 的相关文章

随机推荐

  • ubuntu20.04安装mysql5.7版本

    默认情况下 xff0c ubuntu20 04版本自带的mysql是8 0 xff0c 如果我们需要安装5 7版本 xff0c 我们需要通过如下的方式来安装 1 直接下载二进制压缩包进行安装 xff0c 解压并设置相关的参数就可以运行 2
  • [Warning] root@localhost is created with an empty password ! Please consider switching off the解决办法

    如题所示 xff0c 当我们在ubuntu1804中 xff0c 通过默认的源安装数据库mysql之后 xff0c 直接就可以通过mysql uroot就可以登录了 xff0c 因为他默认生成的密码是空的 如下所示 xff0c ubuntu
  • tmux基本操作

    tmux是什么 tmux xff08 terminal multiplexer xff09 是Linux上的终端复用神器 xff0c 可从一个屏幕上管理多个终端 xff08 准确说是伪终端 xff09 使用该工具 xff0c 用户可以连接或
  • css小技巧之浮动,居中,周围阴影,relative妙用

    css在布局和样式微调中 xff0c 有很多小技巧 xff0c 今天总结一些小妙招 xff0c 这些方法基本上很好用 xff0c 而且不会轻易弄混淆 我们为了看出效果 xff0c 将页面做了一些修饰 xff0c 比如很多地方加上了边框 xf
  • react+antd动态表单以及数组对象示例

    在实际开发中 xff0c 我们会遇到表单中有些数据项是多个 xff0c 并不是普通的一个值 xff0c 或者一组值 xff0c 而是一个数组 xff0c 比如联系人这一项 xff0c 我们通常会有多个联系人 xff0c 这时候 xff0c
  • notepad++安装c/c++简单编程开发环境

    notepad 43 43 作为一个常用的编辑器 xff0c 加上一些插件可以很方便的作为一个简易的编译运行环境 xff0c 说是简易 xff0c 是因为运行简单的程序或者demo可以很方便 xff0c 如果大型的项目 xff0c 还是通过
  • 去掉webpack脚手架构建的vue项目中的eslint检查

    eslint是一个语法格式检测的工具 xff0c 对于规范开发有好处 xff0c 培养严格的书写习惯 xff0c 但是对于新手来说 xff0c 非常的痛苦 xff0c 有时候没有语法错误 xff0c 仅仅是格式中tab space区分不严格
  • Vue中百度地图的应用

    百度地图对于vue项目也做了依赖 xff0c 他就是vue baidu map xff0c 我们在vue项目中 xff0c 只需要安装vue baidu map依赖即可使用 xff0c 另外 xff0c 百度地图javascript api
  • React Hook “useState“ is called in function “xxx“ which is neither a React function component or解决办法

    如题所示 xff0c 在React开发中 xff0c 我们会自定义一些函数 xff0c 比如hook函数 xff0c 或者组件 xff0c 当我们使用了useState useEffect等这些hook函数的时候 xff0c 可能会报错 x
  • electron+vue项目安装vue-devtools插件

    这里记录一下自己安装过程中遇到的问题 xff1a 1 首先需要安装vue devtools xff0c 遇到了源码编译构建的时候的webpack webpack cli反复提示缺失的问题 这个问题很烦 a git clone https g
  • vue+vuetify表格控件v-data-table使用自定义列渲染

    这里先说明一下vue项目中使用vuetify框架进行整合的办法 xff1a 1 加入依赖 npm install vuetify save 2 加入开发依赖 npm install sass sass loader deepmerge sa
  • vue+vuetify构建简单消息确认框

    vue框架自己好像没有弹出框 xff0c 而vuetify有弹出框v dialog xff0c 没有确认框confirm xff0c 虽然确认框本身就是弹出框 xff0c 但是弹出框的功能有个特点 xff0c 就是确定做一件事情 xff0c
  • docker-compose构建mysql服务

    docker安装mysql服务显得很快捷 xff0c 我们如果使用了docker compose那就更快了 xff0c 我们只需要按照我们的要求 xff0c 设置相应的端口映射 xff0c 如果有需求 xff0c 也可以设置数据映射 配置如
  • Nginx核心模块内置变量

    本文根据Nginx官网整理了Nginx的ngx http core module模块的内置变量 xff0c 可与Apache做对比参考 随后做了一次测试观察各变量的值 xff0c 并附上测试结果 1 变量列表 arg name 请求行中参数
  • js属性名用变量代替

    在前端中 xff0c 我们有时候需要利用变量名来设置属性名 xff0c 虽然不是很常见 xff0c 但是也是一个应用场景 这时候 xff0c 我们如果想当然的 xff0c 直接使用变量来设置 xff0c 那么可能不会达到我们想要的结果的 我
  • nodejs利用ffi库调用windows系统user32库函数获取桌面程序窗口大小

    ffi库是npm提供的操作windows系统库函数的依赖库 xff0c 安装过程会比较麻烦 xff0c 需要编译 xff0c 可能需要npm全局安装windows build tools xff0c 如何安装 xff0c 可以参照这里 这篇
  • nodejs利用ffi库调用windows系统user32函数模拟用户登录操作

    如题所示 xff0c 一般的桌面程序 xff0c 用户登录很简单 xff0c 就是找到用户名和密码输入框 xff0c 输入相应的用户名和密码 xff0c 然后点击 登录 按钮 xff0c 完成登录操作 这是人为操作的步骤 xff0c 如果这
  • 通过vue指令创建electron-vue模板项目出现一直“downloading template“问题

    今天试了一下 xff0c vue init simulatedgreg electron vue vueapp的时候 xff0c 在命令行下一直downloading template xff0c 让我很懊恼 原来vue init创建的时候
  • electron-vue与vuetify整合出现报错:If you‘re seeing “$attrs is readonly“

    如题所示 xff0c 正常情况下electron vue与vuetify的整合 xff0c 因为就是vue与vuetify的整合 xff0c 按照一般的推荐方法 xff0c 基本不会出错 xff0c 但是 xff0c 这里因为electro
  • VISA编程实例(C实现)

    今天写这个文章 xff0c 是因为自己工作中用到了ROHDE amp SCHWARZ xff08 即罗德 施瓦茨公司 xff09 的仪表设备 xff0c 需要通过编程的方式来读取仪表上功率测试结果 xff0c 本来仪表上显示了测试结果 xf