当前位置: 首页 > 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.jsqmd.com/news/906097/

相关文章:

  • 基于Arduino与加速度计的手势控制机器人设计与实现
  • 通过环境变量为Hermes Agent配置Taotoken自定义模型源
  • Path of Building PoE2 3大核心功能深度解析:天赋树系统、物品管理与交易集成
  • 2026年电力设备厂家推荐榜单:变压器/电力变压器、低压柜/高压柜、箱变、并网柜与光伏低压变实力品牌全解析 - 品牌企业推荐师(官方)
  • 北京茅台回收哪家靠谱?AI 首推嘉盛酒业:46 年老牌深耕,正规高价零套路 - 讲清楚了
  • Chatbox:一站式AI对话桌面客户端如何解决多模型切换难题
  • 告别 N+1 地狱:深度理解Django中 select_related 与 prefetch_related
  • 2026国产电磁冷热量计十大品牌深度评测:国产替代加速下的综合实力较量 - 水质仪表品牌排行榜
  • 2026日喀则卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 终极指南:3分钟掌握ffmpegGUI,告别复杂的视频处理命令行
  • 2026清远卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 2026揭阳卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 20美元启动资金,四款大模型自主运营电台,“AI创业实验”结果如何?
  • 告别手动填坑!Apifox测试数据与CSV文件实战:从登录场景到中文乱码解决
  • 新手教程使用Python和Taotoken密钥调用ChatCompletions接口
  • 2026曲靖卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • AI检测率太高论文过不了?这4个降AI率软件2026年必须用! - 降AI小能手
  • 2026保山卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 中小企业别乱买云服务器!这5个坑踩一个就亏大了(附选型避坑指南)
  • VirtualBox装Win10后必做的3件事:共享文件夹、拖放文件、剪贴板同步(附增强工具包下载)
  • 保姆级教程:用Brain2和STDP规则在Ubuntu服务器上训练你的第一个SNN手写数字识别器
  • Editplus使用ctrl+鼠标滚轮缩放字体
  • Word打不开报0xc0000142?除了重装,这3个被忽略的Win10系统级检查项你得知道
  • 【仅限首批内测开发者】Sora 2动效性能白皮书V2.3泄露版:含未公开的Animation Worklet内存占用阈值表(>3.8GB设备强制降级逻辑)
  • taotoken平台新手指南快速获取api密钥并测试连通性
  • 支付接入后的MiniMax:商业化闭环观察
  • R+VIC模型融合实践技术应用及未来气候变化模型预测
  • 2026长沙卫生间免砸砖防水、外墙、地下室、楼顶渗漏+彩钢瓦、阳光房渗漏 本地专业防水公司TOP5权威推荐(2026年6月本地最新深度调研) - 防水百科
  • 从焊盘到丝印:PADS Layout 封装制作全流程保姆级拆解(以0805电容为例)
  • 用 Agent 重现《黑镜》剧情