在 USB 设备中,VIDPID 是两个重要的硬件标识符:

VID (Vendor ID) - 厂商识别码

  • 全称:Vendor ID(供应商识别码)

  • 分配机构:由 USB-IF(USB Implementers Forum,USB实施者论坛)统一分配给每个USB设备制造商

  • 唯一性:每个厂商的VID是全球唯一的

  • 长度:16位(2字节),通常用十六进制表示(如 0x10C4

PID (Product ID) - 产品识别码

  • 全称:Product ID(产品识别码)

  • 分配方式:由设备制造商自行定义,用于标识同一厂商的不同产品型号

  • 作用:区分同一厂商生产的不同设备

  • 长度:16位(2字节),十六进制表示(如 0xEA60

在 usb-serial-for-android 中的作用

在这个 Android USB 串口库中,VID 和 PID 用于识别和过滤特定的USB串口设备

1. 设备过滤 (device_filter.xml)

你需要在 res/xml/device_filter.xml 中声明要支持的设备:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Silicon Labs CP210x 系列 -->
    <usb-device vendor-id="4292" product-id="60000" /> <!-- 0x10C4:0xEA60 -->
    
    <!-- FTDI FT232 系列 -->
    <usb-device vendor-id="1027" product-id="24597" />  <!-- 0x0403:0x6001 -->
    
    <!-- Arduino (Atmega16U2) -->
    <usb-device vendor-id="9025" product-id="66" />     <!-- 0x2341:0x0042 -->
</resources>

2. 代码中的设备探测

库内部使用 VID:PID 组合来识别支持的芯片类型:

  • FTDI(如 0x0403:0x6001

  • Silicon Labs CP210x(如 0x10C4:0xEA60

  • Prolific PL2303(如 0x067B:0x2303

  • CH340/CH341(如 0x1A86:0x7523

  • Arduino 系列等


常见 USB 转串口芯片的 VID/PID

厂商

芯片型号

VID

PID

FTDI

FT232RL

0x0403

0x6001

Silicon Labs

CP2102/CP2104

0x10C4

0xEA60

Prolific

PL2303

0x067B

0x2303

WCH(沁恒)

CH340/CH341

0x1A86

0x7523

Arduino

Uno (ATmega16U2)

0x2341

0x0043

Arduino

Mega 2560

0x2341

0x0010


为什么需要配置 VID/PID?

  1. 自动识别:Android 系统通过 VID/PID 知道何时启动你的应用

  2. 权限管理:系统根据 VID/PID 匹配决定是否弹出权限请求

  3. 驱动选择:库根据 VID/PID 选择正确的通信协议和驱动实现

  4. 安全过滤:防止应用响应不相关的 USB 设备


如何查看设备的 VID/PID?

在 Android 上

UsbDevice device = ...;
int vid = device.getVendorId();   // 获取 VID(十进制)
int pid = device.getProductId();  // 获取 PID(十进制)
Log.d("USB", String.format("VID: 0x%04X, PID: 0x%04X", vid, pid));

在电脑上

  • Windows:设备管理器 → 属性 → 详细信息 → 硬件ID

  • Linuxlsusb 命令

  • macOSsystem_profiler SPUSBDataType


总结

VID 和 PID 就像是 USB 设备的"身份证"

  • VID = 品牌(如 "Silicon Labs")

  • PID = 型号(如 "CP2102 USB转串口芯片")