当前位置: 首页 > news >正文

告别Windows!在Ubuntu 22.04上搞定NI-VISA驱动,让你的USB示波器跑起来

告别Windows!在Ubuntu 22.04上搞定NI-VISA驱动,让你的USB示波器跑起来

对于习惯了Windows平台的工程师来说,迁移到Linux环境进行仪器控制可能会让人望而生畏。但Ubuntu 22.04 LTS提供的稳定性和性能优势,加上NI-VISA驱动的强大功能,完全可以构建一个高效可靠的测控工作流。本文将带你一步步解决从驱动安装到实际应用中的所有关键问题。

1. 环境准备与系统兼容性检查

在开始安装NI-VISA之前,确保你的Ubuntu 22.04系统已经更新到最新状态:

sudo apt update && sudo apt upgrade -y

内核版本匹配是NI-VISA安装成功的关键。运行以下命令检查当前内核版本:

uname -r

NI官方提供的驱动包通常针对特定内核版本进行优化。如果发现版本不匹配,你有两个选择:

  1. 在NI官网下载页面查找与你的内核版本匹配的驱动包
  2. 考虑将系统内核降级到驱动支持的版本(不推荐,可能影响系统稳定性)

注意:Ubuntu 22.04默认使用较新的内核,而NI-VISA驱动更新可能滞后,这是最常见的兼容性问题来源。

2. NI-VISA驱动安装全流程

2.1 下载与安装基础驱动

从NI官网下载适合Ubuntu 22.04的驱动包后,执行以下安装步骤:

sudo apt install ./ni-ubuntu2204-drivers-2024Q2.deb sudo apt update sudo apt install ni-visa

安装完成后,验证以下关键文件是否存在:

文件路径作用
/etc/udev/rules.d/nivisa_usbtmc.rulesUSB-TMC设备规则
/etc/udev/agents.d/usb/nivisa_usbrawUSB原始设备代理
/etc/udev/agents.d/usb/nivisa_usbtmcUSB-TMC设备代理

如果缺少这些文件,需要手动创建符号链接:

sudo mkdir -p /etc/udev/agents.d/usb sudo ln -s /usr/lib/x86_64-linux-gnu/ni-visa/usb/nivisa_usbraw /etc/udev/agents.d/usb/ sudo ln -s /usr/lib/x86_64-linux-gnu/ni-visa/usb/nivisa_usbtmc /etc/udev/agents.d/usb/ sudo ln -s /usr/lib/x86_64-linux-gnu/ni-visa/usb/nivisa_usbtmc.rules /etc/udev/rules.d/

2.2 处理系统原生驱动冲突

Ubuntu自带的usbtmcusbtest模块会与NI-VISA产生冲突,需要将其加入黑名单:

echo 'blacklist usbtmc' | sudo tee /etc/modprobe.d/nousbtmc.conf echo 'blacklist usbtest' | sudo tee -a /etc/modprobe.d/nousbtmc.conf

验证黑名单是否生效:

cat /etc/modprobe.d/nousbtmc.conf

提示:修改黑名单后必须重启系统才能生效

3. 设备连接与权限配置

3.1 USB设备识别与调试

连接你的USB示波器后,使用以下命令检查设备是否被识别:

lsusb dmesg | grep -i usb

常见的权限问题可以通过创建udev规则解决。创建一个新的规则文件:

sudo nano /etc/udev/rules.d/99-usbtmc.rules

添加以下内容(根据你的设备VID/PID修改):

SUBSYSTEM=="usb", ATTR{idVendor}=="0957", ATTR{idProduct}=="0518", MODE="0666", GROUP="plugdev"

重新加载udev规则:

sudo udevadm control --reload-rules sudo udevadm trigger

3.2 验证NI-VISA安装

使用NI提供的工具验证安装是否成功:

/usr/local/natinst/nivisa/bin/visaconf

如果一切正常,你应该能看到类似这样的输出:

VISA Configuration Program -------------------------- Found VISA installation at /usr/local/natinst/nivisa VISA version: 20.0

4. 开发环境搭建与SCPI通信

4.1 基础C++开发环境配置

安装必要的编译工具和开发库:

sudo apt install build-essential cmake pkg-config

创建简单的CMake项目时,确保链接NI-VISA库:

cmake_minimum_required(VERSION 3.10) project(scope_control) set(CMAKE_CXX_STANDARD 17) find_package(PkgConfig REQUIRED) pkg_check_modules(NIVISA REQUIRED ni-visa) add_executable(scope scope.cpp) target_include_directories(scope PRIVATE ${NIVISA_INCLUDE_DIRS}) target_link_libraries(scope ${NIVISA_LIBRARIES})

4.2 SCPI通信实战代码

下面是一个增强版的SCPI通信示例,包含错误处理和超时设置:

#include <ni-visa/visa.h> #include <iostream> #include <string> #include <chrono> #include <thread> constexpr size_t MAX_SCPI_LEN = 4096; constexpr int TIMEOUT_MS = 5000; bool check_visa_error(ViStatus status, const std::string& operation) { if (status < VI_SUCCESS) { char desc[VI_FIND_BUFLEN] = {0}; viStatusDesc(VI_NULL, status, desc); std::cerr << "Error in " << operation << ": " << desc << " (0x" << std::hex << status << ")" << std::endl; return false; } return true; } std::string query_instrument(ViSession vi, const std::string& command) { ViUInt32 retCount = 0; char buffer[MAX_SCPI_LEN] = {0}; if (!check_visa_error(viWrite(vi, (ViConstBuf)command.c_str(), command.length(), &retCount), "viWrite")) { return ""; } if (!check_visa_error(viRead(vi, (ViPBuf)buffer, MAX_SCPI_LEN-1, &retCount), "viRead")) { return ""; } buffer[retCount] = '\0'; return std::string(buffer); } int main() { ViSession defaultRM = VI_NULL; ViSession instrument = VI_NULL; ViFindList findList = VI_NULL; ViUInt32 numInstr = 0; char resourceName[VI_FIND_BUFLEN] = {0}; // 初始化VISA会话 if (!check_visa_error(viOpenDefaultRM(&defaultRM), "viOpenDefaultRM")) { return EXIT_FAILURE; } // 设置超时 viSetAttribute(defaultRM, VI_ATTR_TMO_VALUE, TIMEOUT_MS); // 查找USB设备 if (!check_visa_error(viFindRsrc(defaultRM, "USB?*INSTR", &findList, &numInstr, resourceName), "viFindRsrc")) { viClose(defaultRM); return EXIT_FAILURE; } std::cout << "Found " << numInstr << " instrument(s)" << std::endl; // 打开第一个找到的设备 if (!check_visa_error(viOpen(defaultRM, resourceName, VI_NULL, VI_NULL, &instrument), "viOpen")) { viClose(findList); viClose(defaultRM); return EXIT_FAILURE; } // 查询设备ID std::string idn = query_instrument(instrument, "*IDN?\n"); if (!idn.empty()) { std::cout << "Instrument ID: " << idn; } // 示例:设置示波器时基 if (check_visa_error(viWrite(instrument, (ViConstBuf)"TIM:MAIN:SCAL 0.001\n", 21, VI_NULL), "set timebase")) { std::cout << "Timebase set to 1ms/div" << std::endl; } // 清理资源 viClose(instrument); viClose(findList); viClose(defaultRM); return EXIT_SUCCESS; }

4.3 Python开发方案

对于偏好Python的开发者,可以使用PyVISA库:

pip install pyvisa pyvisa-py

示例Python代码:

import pyvisa as visa rm = visa.ResourceManager('@ni') resources = rm.list_resources() print(f"Available resources: {resources}") if resources: with rm.open_resource(resources[0]) as inst: inst.timeout = 5000 # 5秒超时 print(inst.query("*IDN?")) # 设置并读取波形 inst.write(":WAV:SOUR CHAN1") inst.write(":WAV:FORM ASCII") waveform = inst.query(":WAV:DATA?") print(f"Waveform points: {len(waveform.split(','))}")

5. 高级配置与性能优化

5.1 内核参数调优

对于高性能测量应用,可能需要调整内核参数:

sudo sysctl -w net.core.rmem_max=4194304 sudo sysctl -w net.core.wmem_max=4194304

将这些设置永久化:

echo "net.core.rmem_max=4194304" | sudo tee -a /etc/sysctl.conf echo "net.core.wmem_max=4194304" | sudo tee -a /etc/sysctl.conf

5.2 实时内核考虑

对于时间敏感的测量任务,可以考虑安装Linux实时内核:

sudo apt install linux-rt-5.15

安装后需要重新配置NI-VISA驱动:

sudo /usr/local/natinst/nivisa/bin/visaconf --reinstall

5.3 自动化测试脚本

创建一个简单的Bash脚本来自动化设备检测和基本测试:

#!/bin/bash # 检查NI-VISA安装 if [ ! -f "/usr/local/natinst/nivisa/bin/visaconf" ]; then echo "NI-VISA not installed!" exit 1 fi # 检查USB设备 echo "Connected USB devices:" lsusb | grep -i "test|measure|tek|rigol|keysight" # 简单VISA测试 /usr/local/natinst/nivisa/bin/visaconf -t

记得给脚本添加执行权限:

chmod +x visa_test.sh
http://www.gsyq.cn/news/1417403.html

相关文章:

  • 2026年上海办公室装修公司多角度解析 - 资讯快报
  • 聊聊华为“韬定律”:穿越旧秩序的冷眼,重写新规则的标尺
  • Path of Building PoE2 3大核心功能深度解析:天赋树系统、物品管理与交易集成
  • Chatbox:一站式AI对话桌面客户端如何解决多模型切换难题
  • 终极指南:3分钟掌握ffmpegGUI,告别复杂的视频处理命令行
  • 告别手动填坑!Apifox测试数据与CSV文件实战:从登录场景到中文乱码解决
  • 2026曲靖卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 中小企业别乱买云服务器!这5个坑踩一个就亏大了(附选型避坑指南)
  • Word打不开报0xc0000142?除了重装,这3个被忽略的Win10系统级检查项你得知道
  • Editplus使用ctrl+鼠标滚轮缩放字体
  • VirtualBox装Win10后必做的3件事:共享文件夹、拖放文件、剪贴板同步(附增强工具包下载)
  • taotoken平台新手指南快速获取api密钥并测试连通性
  • 从焊盘到丝印:PADS Layout 封装制作全流程保姆级拆解(以0805电容为例)
  • 2026拉萨卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 2026年 福建工业除尘设备厂家甄选:粉尘除尘器、车间除尘设备、铸造厂除尘器与食品厂滤筒除尘器领域实力供应厂商 - 品牌企业推荐师(官方)
  • Claude重构建议实战手册:5个真实项目中被忽略的致命细节及修复方案
  • 2026年 沥青工程与施工公司推荐榜单:道路铺装、厂区硬化及防水耐磨工艺深度评测 - 品牌企业推荐师(官方)
  • 直播APP开发必备功能盘点:美颜SDK、连麦互动与实时音视频技术
  • Spring Bean作用域以及生命周期
  • 2026衡阳卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 【YOLO目标检测全栈实战】91 知识蒸馏的工程化落地:从论文到生产环境的最后一公里
  • 2026鄂州卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 2026济南卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 20260528 2
  • 一个导出按钮,为什么最后会变成后台任务系统?
  • 写了8年代码,今天被95后产品经理上了一课
  • 告别提取码搜索困境:baidupankey如何让百度网盘资源获取变得简单
  • 2026年东莞滴胶标牌/金属标牌/不锈钢标牌/铝标牌生产厂家最新概览:核心评估与实力筛选 - 品牌企业推荐师(官方)
  • 跨越设计实现鸿沟:AI时代设计师的系统思维与技术掌控力进阶
  • 来自教授的有用链接 — 40