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
相关产品推荐
相关产品推荐

