当前位置: 首页 > 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.cnnetsun.cn/news/2627301.html

相关文章:

  • VirtualBox装Win10后必做的3件事:共享文件夹、拖放文件、剪贴板同步(附增强工具包下载)
  • 【心电图处理】基于MIT-BIH心律失常数据库心电图信号去噪、R峰检测和心率变异性HRV分析Matlab实现
  • 干掉繁琐搬运!企业级AI Agent免费社区版深度评测:中小企业数字化转型的“破局”利器
  • 通过 Taotoken CLI 一键配置团队开发环境中的模型密钥
  • 格式错位=推理失效?DeepSeek RAG流水线中JSON Schema校验缺失导致37%响应解析失败,速查修复清单
  • 使用GD32实现JTAG功能
  • 手把手教你用OSX-KVM项目搞定macOS Monterey安装:从XML配置到驱动优化避坑指南
  • 第05篇|窗口与安全区:AppStorage 如何保存宽高、状态栏和暗色模式
  • 告别虚拟机!在安卓手机上用Termux运行ArchLinux,实测开发环境搭建与避坑指南
  • bean的作用域与生命周期
  • 6Pin数码管驱动和编码器旋钮检测
  • 从Solidworks草图到桌面摆件:我如何用3D打印给自己做了个PLA手机支架(附切片避坑指南)
  • Taotoken用量看板与成本管理功能的实际使用观感
  • 基于ESP32与SCD41传感器的开源智能CO₂监测仪制作全攻略
  • 如何用哔哩下载姬downkyi轻松下载B站视频:从入门到精通完全指南
  • WingData HTB 渗透测试完整攻略
  • 别再自己写扫码了!用uniapp插件Ba-Scanner,5分钟搞定连续扫码和自定义UI
  • 笔记本刚开机就高温?CPU 90℃、风扇狂转、网速消耗殆尽——威胁检测工程师实战排查全过程
  • PointPillars算法避坑指南:从VoxelNet到Apollo实战,聊聊那些容易踩的‘坑’
  • 权重衰减为何放入优化器
  • 什么是OPC(一人公司)?
  • 代码即玩法:非典型游戏开发的英文提示词实践
  • 从 MCP 到 A2A:Agent 项目里“通信协议”到底在解决什么问题?
  • 别再手动排路线了!用Python+遗传算法搞定物流配送VRP(附完整代码)
  • 番茄小说下载器完整指南:打造个人离线数字图书馆的终极方案
  • 2026权威实测:16款降AIGC软件横评,论文安全过关就靠它!
  • 如何用Ai2Psd脚本实现Illustrator到Photoshop的无损图层转换?3步极速指南
  • 真机实测:Hermes Agent Windows 全流程安装与配置指南
  • 多活不是口号,是算力——DeepSeek高可用架构落地三原则,含真实RTT压测数据与Failover耗时对比表
  • RPGMakerDecrypter完全指南:3步解密RPG Maker加密存档的专业方法