You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux下开发程序对接非串口USB设备(Salae Logic逻辑分析仪)

如何在Linux下访问非USB转串口的Salae Logic逻辑分析仪

这类设备属于USB原始设备,不会生成串口设备文件,需要直接通过USB协议与设备通信,以下是具体实现方案:

1. 使用libusb库直接操作USB设备

libusb是跨平台的用户空间USB设备访问库,是这类场景的首选方案:

  • 安装libusb
    Debian/Ubuntu系系统执行:
    sudo apt-get install libusb-1.0-0-dev
    
    RHEL/CentOS系执行:
    sudo yum install libusb1-devel
    
  • 配置设备权限
    默认普通用户无USB设备访问权限,需添加udev规则。创建文件/etc/udev/rules.d/99-saleae.rules,写入:
    SUBSYSTEM=="usb", ATTRS{idVendor}=="0925", ATTRS{idProduct}=="3881", MODE="0666"
    
    重新加载udev规则:
    sudo udevadm control --reload-rules && sudo udevadm trigger
    
  • C++代码示例
    核心流程为初始化libusb、查找设备、打开设备、配置接口、传输数据:
    #include <libusb-1.0/libusb.h>
    #include <iostream>
    
    int main() {
        libusb_context *ctx = nullptr;
        int rc = libusb_init(&ctx);
        if (rc != LIBUSB_SUCCESS) {
            std::cerr << "libusb初始化失败: " << libusb_error_name(rc) << std::endl;
            return 1;
        }
    
        // 匹配设备:vendor ID 0925,product ID 3881
        libusb_device_handle *dev_handle = libusb_open_device_with_vid_pid(ctx, 0x0925, 0x3881);
        if (!dev_handle) {
            std::cerr << "无法打开设备" << std::endl;
            libusb_exit(ctx);
            return 1;
        }
    
        // 断开内核驱动(若设备被内核驱动占用)
        if (libusb_kernel_driver_active(dev_handle, 0)) {
            rc = libusb_detach_kernel_driver(dev_handle, 0);
            if (rc != LIBUSB_SUCCESS) {
                std::cerr << "无法断开内核驱动: " << libusb_error_name(rc) << std::endl;
                libusb_close(dev_handle);
                libusb_exit(ctx);
                return 1;
            }
        }
    
        // 声明设备接口
        rc = libusb_claim_interface(dev_handle, 0);
        if (rc != LIBUSB_SUCCESS) {
            std::cerr << "无法声明接口: " << libusb_error_name(rc) << std::endl;
            libusb_close(dev_handle);
            libusb_exit(ctx);
            return 1;
        }
    
        // 批量读取设备数据示例
        unsigned char buffer[64];
        int transferred;
        rc = libusb_bulk_transfer(dev_handle, LIBUSB_ENDPOINT_IN | 1, buffer, sizeof(buffer), &transferred, 1000);
        if (rc == LIBUSB_SUCCESS) {
            std::cout << "读取到" << transferred << "字节数据" << std::endl;
            // 此处添加数据处理逻辑
        } else {
            std::cerr << "批量传输失败: " << libusb_error_name(rc) << std::endl;
        }
    
        // 释放资源
        libusb_release_interface(dev_handle, 0);
        libusb_close(dev_handle);
        libusb_exit(ctx);
        return 0;
    }
    
    编译时链接libusb库:
    g++ -o saleae_reader saleae_reader.cpp -lusb-1.0
    

2. 基于开源项目二次开发

sigrok项目支持多款逻辑分析仪(包括Salae Logic),它封装了底层USB操作,提供上层API简化数据采集与解析。你可以直接使用libsigrok库开发,或参考其源码理解设备的通信协议细节。

关键注意事项

  • 必须掌握设备的USB通信协议:包括端点类型(批量/中断/控制)、数据格式、命令集等,可通过开源项目代码或USB抓包工具(如usbmon)分析。
  • 权限配置是必要步骤,避免每次运行程序都需要sudo。
  • 若设备被内核驱动占用,需先调用libusb_detach_kernel_driver断开驱动,否则无法声明接口。

内容的提问来源于stack exchange,提问作者Dimitrios Desyllas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 16:48:24