news 2026/7/23 12:24:04

NI-VISA 核心 API

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NI-VISA 核心 API

NI-VISA 核心 API 整理

约定ViStatus返回值:≥ VI_SUCCESS(0)成功;<0错误 【IN】输入参数,【OUT】输出参数

1. viOpenDefaultRM:打开 VISA 资源管理器

ViStatus viOpenDefaultRM(ViSession *rmSession);

调用示例

ViSession rmSession; ViStatus status = viOpenDefaultRM(&rmSession); if(status < VI_SUCCESS) { QLOG_ERROR() << "VISA资源管理器打开失败,请确认安装NI-VISA驱动"; return false; }

参数分析

  • ViSession *rmSession【OUT】 输出资源管理器句柄;调用前变量无效,成功后得到合法句柄。

要点分析

  1. 所有 VISA 操作入口函数;全局建议只打开一次,不要反复创建销毁;
  2. 本机未安装 NI-VISA 驱动,调用直接失败;
  3. 资源管理器管理本机全部 GPIB/TCPIP/USB 仪器资源。

2. viOpen:建立单台仪器会话

ViStatus viOpen( ViSession rmSession, //【IN】资源管理器句柄 ViConstRsrc resourceName, //【IN】VISA资源字符串 ViAccessMode accessMode, //【IN】访问模式 ViUInt32 timeout, //【IN】打开超时 ViSession *instrSession //【OUT】仪器会话句柄 );

调用示例

ViSession pInstrHandle; ViStatus status = viOpen(rmSession, "TCPIP0::192.168.1.70::inst0::INSTR", VI_NULL, VI_NULL, &pInstrHandle); if(status < VI_SUCCESS) { QLOG_ERROR() << "仪器连接失败"; viClose(rmSession); return false; }

参数说明

  1. rmSession:上一步打开的资源管理器句柄;
  2. resourceName:仪器资源地址字符串;
  3. accessMode = VI_NULL使用默认共享模式;
  4. timeout = VI_NULL继承会话默认超时;
  5. &pInstrHandle【OUT】连接成功输出仪器句柄,后续 viWrite/viScanf 全部依赖此句柄。

3. viFindRsrc:批量检索 VISA 仪器资源

ViStatus viFindRsrc( ViSession rmSession, //【IN】资源管理器句柄 ViString expr, //【IN】检索匹配表达式 ViFindList *findList, //【OUT】枚举列表句柄 ViUInt32 *count, //【OUT】搜索到设备总数 ViChar desc[] //【OUT】缓冲区,保存第一条资源字符串 );

调用示例

ViFindList findList; ViUInt32 numInstrs; char instrDescriptor[VI_FIND_BUFLEN]; ViStatus status = viFindRsrc(defaultRM, "?*INSTR", &findList, &numInstrs, instrDescriptor); if(status < VI_SUCCESS) { QLOG_ERROR() << "仪器检索失败"; return status; }

参数 & 问题分析

  • 检索表达式标准写法:"?*INSTR"
  • findList:枚举句柄,必须最后调用viClose(findList)释放;
  • instrDescriptor字符数组作为输出缓冲区,承载资源名称;
  • 仅获取第一条仪器,剩余设备依靠viFindNext循环读取。

4. viFindNext:获取下一条仪器资源

ViStatus viFindNext( ViFindList findList, //【IN】viFindRsrc生成的枚举句柄 ViChar desc[] //【OUT】缓冲区,接收下一个资源字符串 );

调用示例

while (--numInstrs) { status = viFindNext(findList, instrDescriptor); if(status < VI_SUCCESS) break; QLOG_DEBUG() << instrDescriptor; }

要点分析

  1. 必须在viFindRsrc成功之后调用;
  2. 循环持续填充instrDescriptor;检索结束或出错返回负数;
  3. 整套枚举完成后务必viClose(findList)

5. viWrite:发送 SCPI 命令

ViStatus viWrite( ViSession session, //【IN】仪器会话句柄 ViBuf buffer, //【IN】待发送数据指针 void* ViUInt32 count, //【IN】期望发送字节数 ViUInt32 *retCount //【OUT】实际成功发送字节数 );

调用示例

char stringinput[512]; strncpy(stringinput,"*RST\n",sizeof(stringinput)-1); ViUInt32 writeCount; ViStatus status = viWrite(pInstrHandle, (ViBuf)stringinput, (ViUInt32)strlen(stringinput), &writeCount); if(status < VI_SUCCESS) { QLOG_ERROR() << "指令发送失败"; return false; }

分析

  1. 常用于下发*RSTCONF:VOLTREAD?ROUT:MON
  2. retCount可用来校验半包:预期长度!= 实际长度代表发送异常;
  3. SCPI 网口仪器建议指令末尾带上\n作为命令终止符。

6. viScanf:格式化阻塞读取

ViStatus viScanf(ViSession session, ViString format, ...);

调用示例

double DQ973A_voltage_data[16]; ViStatus status = viScanf(pInstrHandle,"%,1000lf",DQ973A_voltage_data); if(status < VI_SUCCESS) { QLOG_ERROR() << "读取测量数据超时/失败"; return false; }

格式说明"%,1000lf"

  • %lf读取 double 浮点;
  • ,代表自动识别逗号分隔
  • 1000最多解析 1000 个浮点数;

重点风险

  1. 阻塞函数,超时时间由VI_ATTR_TMO_VALUE控制;主线程直接调用会 UI 卡死;
  2. 必须判断返回 ViStatus!你原有代码完全忽略返回值,读取失败数组保留旧数值,造成虚假测量结果;
  3. 适配 DQ973AREAD?指令:仪器返回val1,val2,val3...自动拆分填入数组,无需手动字符串切割。

7. viSetAttribute:设置会话属性

ViStatus viSetAttribute( ViSession session, //【IN】仪器句柄 ViAttr attribute, //【IN】属性ID ViAttrState value //【IN】属性配置值 );

调用示例

viSetAttribute(pInstrHandle, VI_ATTR_TMO_VALUE, 5000); viSetAttribute(pInstrHandle, VI_ATTR_SUPPRESS_END_EN, VI_FALSE); viSetAttribute(pInstrHandle, VI_ATTR_SEND_END_EN, VI_FALSE);

参数分析

全部为输入参数,无输出;

  • VI_ATTR_TMO_VALUE:读写超时,单位 ms;
  • VI_ATTR_SEND_END_EN = VI_FALSE关闭底层自动 END 信号,TCP 网口仪器标准配置,不要随意修改。

8. viClose:关闭各类 VISA 会话

ViStatus viClose(ViSession session); //【IN】任意合法句柄

调用示例

viClose(pInstrHandle); //关闭仪器会话 viClose(findList); //关闭枚举列表 viClose(rmSession); //关闭资源管理器

两条标准业务流程

流程 A:界面扫描仪器列表

viOpenDefaultRM → viFindRsrc → 循环viFindNext → viClose(findList) → viClose(defaultRM)

注意:窗口扫描完成后关闭资源管理器;长期运行程序不建议频繁开关。

流程 B:连接 设备 + 采集数据

viOpenDefaultRM(全局一次) → viOpen(资源串, &pInstrHandle) → viSetAttribute 配置超时、END参数 → viWrite 下发SCPI配置指令 → viWrite("READ?\n") → viScanf 读取多路测量值 //采集结束/断开设备 → viClose(pInstrHandle) //程序退出时 viClose(rmSession)

统一避坑清单

  1. viOpenDefaultRM全局只打开一次,不要循环反复调用;

  2. viOpen/viSetAttribute/viWrite/viScanf每一步都校验ViStatus

  3. viScanf阻塞,禁止在 Qt 主线程大量循环采集;

  4. viClose成对调用,禁止重复关闭同一个句柄;

  5. 网络仪器固定配置:VI_ATTR_SEND_END_EN = VI_FALSE

  6. 通讯异常优先仅关闭仪器句柄,不要轻易关闭资源管理器rmSession

  7. viWrite建议增加半包校验,对比writeCount与预期发送长度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 12:22:10

家庭供暖系统技术解析:燃油锅炉与热泵能效优化

1. Warm-Flow核心业务解析 Warm-Flow是一家专注于家庭供暖解决方案的英国企业&#xff0c;总部位于北爱尔兰利斯本&#xff0c;在英国本土和爱尔兰共和国均设有分支机构。作为暖通行业的专业供应商&#xff0c;其核心业务围绕三大产品线展开&#xff1a;燃油锅炉、储热罐及可再…

作者头像 李华
网站建设 2026/7/23 12:21:59

原画知识科普:从概念到创作的全面解析

一、什么是原画&#xff1f;原画&#xff08;Original Painting/Concept Art&#xff09;&#xff0c;在艺术创作领域&#xff0c;尤其是在动画、游戏、影视等视觉艺术产业中&#xff0c;特指为最终作品&#xff08;如动画片、游戏角色、电影场景&#xff09;所绘制的、用于确定…

作者头像 李华
网站建设 2026/7/23 12:19:30

即梦 AI 官方未公开的5个隐藏功能,90%用户不知道的生产力倍增技巧(限期内测通道已开放)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;即梦 AI 的核心定位与隐藏功能全景概览 即梦 AI 并非传统意义上的通用大模型接口封装工具&#xff0c;而是一个面向创意工作者与开发者深度协同的智能内容操作系统。其核心定位在于“语义—视觉—行为”三重闭…

作者头像 李华
网站建设 2026/7/23 12:17:04

TVP7002寄存器配置详解:从模拟视频信号处理到数字转换实战

1. 项目概述与芯片定位在视频采集系统的设计里&#xff0c;前端模拟信号的处理质量直接决定了整个系统的“天花板”。无论是老旧的VHS录像带、经典的DVD播放器&#xff0c;还是专业的广播级摄像机&#xff0c;它们输出的模拟分量视频信号&#xff08;YPbPr&#xff09;或RGB信号…

作者头像 李华
网站建设 2026/7/23 12:16:57

Microsoft Agent Framework — 介绍一下 Inkwell

目录 引子 Inkwell 是什么 为什么要做这个 后端怎么落 MAF 现在到哪一步了 想看看的话 引子 Microsoft Agent Framework 是微软官方开源的 Agent 框架&#xff1a;AIAgent 把模型调用、工具、记忆、多轮对话统一成一套抽象&#xff1b;Workflows 能编排确定性的多智能体…

作者头像 李华
网站建设 2026/7/23 12:15:41

人教版七年级英语教学资源数字化处理与平台集成技术指南

对于初中英语教学资源的技术性整理和数字化应用&#xff0c;教育工作者和技术支持团队需要一套清晰的方法来管理、验证和优化这些材料。虽然输入材料主要围绕人教版七年级英语上册的视频和PDF资源&#xff0c;但实际项目中更关键的是如何确保这些资源的完整性、可访问性以及在教…

作者头像 李华