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

Rust中如何通过UsbDeviceBuilder设置USB字符串描述符?

在Rust中使用UsbDeviceBuilder设置USB字符串描述符(0.3版本)

问题原因

你遇到的错误核心是:usb-device 0.3版本的strings()方法返回Result<UsbDeviceBuilder, BuilderError>类型,而非直接返回Builder实例。这意味着调用strings()后必须先处理可能的错误,才能继续调用build()方法。

另外你传入的语言ID0x0009是无效值,标准语言ID比如英文-US是0x0409,这也可能是触发错误的原因之一。

正确实现示例

快速调试写法(使用expect处理错误)

use usb_device::device::{StringDescriptors, UsbDeviceBuilder, UsbVidPid};

// 使用标准语言ID(0x0409对应英文-US)构建字符串描述符
let descriptors = [StringDescriptors::new(0x0409.into())
    .manufacturer("No Name Brand")
    .product("Serial port")
    .serial_number("1234567890")];

let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd))
    .device_class(2)
    .strings(&descriptors)
    .expect("Failed to initialize string descriptors") // 先处理Result
    .build();

生产级严谨写法(显式错误处理)

use usb_device::device::{BuilderError, StringDescriptors, UsbDeviceBuilder, UsbVidPid};

let descriptors = [StringDescriptors::new(0x0409.into())
    .manufacturer("No Name Brand")
    .product("Serial port")
    .serial_number("1234567890")];

let mut usb_dev = match UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd))
    .device_class(2)
    .strings(&descriptors)
{
    Ok(builder) => builder.build(),
    Err(err) => {
        eprintln!("String descriptor setup failed: {:?}", err);
        panic!("USB device initialization failed");
        // 生产环境可替换为自定义错误返回逻辑
    }
};

API版本差异说明

  • 旧版本:manufacturer()、product()等方法直接返回UsbDeviceBuilder,可链式调用build()。
  • 0.3版本:统一改用strings()方法传入StringDescriptors数组,该方法会验证字符串描述符的合法性(语言ID有效性、字符串长度是否符合USB规范),因此返回Result类型,必须先处理错误才能完成设备构建。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:27:20