You need to enable JavaScript to run this app. 如何不使用bootloader检测Arduino Leonardo是否已烧录固件
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 02:06:04