如何不使用bootloader检测Arduino Leonardo是否已烧录固件
Arduino Leonardo免Bootloader烧录状态检测方案
最优方案:USB VID/PID特征检测
Arduino Leonardo的官方Bootloader和用户固件默认使用不同的USB产品ID(PID),插电后系统枚举USB设备时即可直接读取该特征,无需进入Bootloader、无需打开串口,检测耗时<10ms,完全满足批量烧录的效率要求:
- 原厂未烧录用户固件的设备(仅保留Bootloader):VID为
0x2341,PID为0x0036 - 已烧录默认用户固件的设备:VID为
0x2341,PID为0x8036
你可以直接用Pyserial自带的端口列表工具实现检测,示例代码如下:
import serial.tools.list_ports # 定义未烧录设备的USB标识 ARDUINO_VID = 0x2341 LEONARDO_BOOTLOADER_PID = 0x0036 # 已处理端口标记集合,避免重复烧录 processed_ports = set() while True: for port in serial.tools.list_ports.comports(): # 跳过已处理的端口 if port.device in processed_ports: continue # 匹配未烧录设备特征 if port.vid == ARDUINO_VID and port.pid == LEONARDO_BOOTLOADER_PID: print(f"检测到未烧录设备,端口:{port.device}") # 调用你现有烧录逻辑处理该端口 # your_upload_function(port.device) # 标记为已处理 processed_ports.add(port.device) # 清理已拔出的端口标记 current_ports = {p.device for p in serial.tools.list_ports.comports()} processed_ports &= current_ports
备选方案:自定义固件标识检测
如果你修改了用户固件的USB VID/PID配置,可以在固件中增加开机主动上报逻辑,配合短超时串口检测实现判定:
- 在用户固件的
setup()函数中添加串口输出代码:Serial.println("*BURNED*"); - 程序检测到新端口后,以固件对应波特率打开串口,设置100ms读超时,若能读到
*BURNED*标识则判定为已烧录,否则判定为未烧录
效率优化建议
- 可以替换轮询端口逻辑为系统USB插拔事件监听,Windows端可通过WMI实现,Linux端可通过udev规则实现,设备插入即可触发检测,无需固定间隔轮询
- 多设备并行烧录时可通过线程池分配端口处理任务,最大化利用烧录带宽
内容的提问来源于stack exchange,提问作者Eric Hedengren
相关产品推荐
相关产品推荐

