如何为USB连接的PIC24FJ128GC006烧录唯一序列号实现持久识别
为PIC24FJ128GC006设置唯一USB iSerial值的实现方案
完全可以在烧录阶段为每台设备写入唯一标识符,让lsusb -v输出不同的iSerial值,从而生成独立的/dev/serial/by-id条目,具体操作如下:
1. 核心原理
USB设备的iSerial对应字符串描述符的索引,/dev/serial/by-id的命名正是基于该值+设备VID/PID生成。要实现唯一识别,只需让每台设备的固件在USB枚举时,返回不同的iSerial字符串即可。
2. 固件修改要点
- 利用芯片内置唯一ID:PIC24FJ128GC006自带出厂固化的唯一硬件ID(查看 datasheet 可找到对应寄存器,比如
DEVID0、DEVID1等连续寄存器),固件启动时读取这些寄存器的值,格式化为字符串后填充到USB字符串描述符的iSerial字段。 - 自定义写入唯一值:如果内置ID不符合需求,可将自定义的唯一字符串(比如设备编号、MAC格式字符串)写入芯片的EEPROM区域,固件启动时读取该区域内容作为iSerial值。
- 修改USB描述符代码:找到固件中定义USB字符串描述符的数组,将原本固定的iSerial字符串替换为动态读取的唯一值。
3. 烧录阶段写入唯一值
- MPLAB X IDE + PICKIT 5 可视化操作:
- 打开项目的烧录配置,在"Programmer"设置中找到"Custom Data"选项,为每台设备手动输入唯一的序列号字符串,烧录时该值会被写入指定的EEPROM地址。
- 命令行批量烧录:
- 使用PICKIT 5的命令行工具
pk5cmd,编写脚本自动为每台设备分配递增的唯一值,通过-w参数写入到EEPROM的指定地址,实现批量自动化烧录。
- 使用PICKIT 5的命令行工具
4. 验证步骤
烧录完成后连接设备到电脑:
- 执行
lsusb -v,找到对应设备的iSerial字段,确认每台设备的值唯一。 - 查看
/dev/serial/by-id/目录,应该会出现与设备数量一致的独立条目,且重启或插拔设备后路径不会变化。
内容的提问来源于stack exchange,提问作者Kepler7894i
相关产品推荐
相关产品推荐

