我如何强迫莱昂纳多重置avrdude?

Bob*_*421 4 arduino

我想在莱昂纳多董事会上自己编译和转移Arduino程序.

使用Arduino官方IDE,一切都很好用.我已启用详细模式进行编译和字节码传输.

我可以看到每个命令行.我想了解每一行.

除了最后一步,一切都很好:与avrdude一起转移.如果我输入完全相同的命令,我会收到一个错误:

.avrdude: butterfly_recv(): programmer is not responding
Run Code Online (Sandbox Code Playgroud)

如果我使用Arduino IDE上传代码,则不会出现此错误.

我可以看到一个区别 - Arduino IDE在avrdude调用之前显示这一行:

Forcing reset using 1200bps open/close on port /dev/cu.usbmodem1431
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何通过命令行重置?

gib*_*nic 9

我在 macOS 上遇到了同样的问题,我想出了以下 Bash 脚本:

# Find the Arduino port
ARDUINO_UPLOAD_PORT="$(find /dev/cu.usbmodem* | head -n 1)"

# Reset the Arduino
stty -f "${ARDUINO_UPLOAD_PORT}" 1200

# Wait for it...
while :; do
  sleep 0.5
  [ -c "${ARDUINO_UPLOAD_PORT}" ] && break
done

# ...upload!
avrdude "${OPTIONS[@]}"
Run Code Online (Sandbox Code Playgroud)

while环路的伎俩!一旦 Arduino 端口重新上线,它就会继续进行。

这是我为Sesame项目编写的 Makefile 的一部分。

  • 不确定这是笔误还是 MacOS 问题。在 Linux 下,`stty` 只有一个 `-F` 开关,它似乎可以做上面的 `-f` 应该做的事情...... (2认同)

p1n*_*1ne 6

为了从Windows上传,我为avrdude制作了bat文件包装器.

它使用WMI识别Leonardo COM端口,使用mode命令将此COM端口重置为1200波特,然后识别引导加载程序COM端口并调用avrdude.

应将固件放置到firmware.hex,但可以将其更改为从命令行提供

代码在GitHub repo这里https://github.com/p1ne/arduino-leonardo-uploader

或以下:

@echo off
setlocal

for /f "tokens=1* delims==" %%I in ('wmic path win32_pnpentity get caption  /format:list ^| find "SparkFun Pro Micro"') do (
    call :resetCOM "%%~J"
)

:continue

:: wmic /format:list strips trailing spaces (at least for path win32_pnpentity)
for /f "tokens=1* delims==" %%I in ('wmic path win32_pnpentity get caption  /format:list ^| find "Arduino Leonardo bootloader"') do (
    call :setCOM "%%~J"
)

:: end main batch
goto :EOF

:resetCOM <WMIC_output_line>
:: sets _COM#=line
setlocal
set "str=%~1"
set "num=%str:*(COM=%"
set "num=%num:)=%"
set port=COM%num%
echo %port%
mode %port%: BAUD=1200 parity=N data=8 stop=1
goto :continue

:setCOM <WMIC_output_line>
:: sets _COM#=line
setlocal
set "str=%~1"
set "num=%str:*(COM=%"
set "num=%num:)=%"
set port=COM%num%
echo %port%
goto :flash

:flash
avrdude -v -C./avrdude.conf -patmega32u4 -cavr109 -P%port% -b57600 -D -V -Uflash:w:./firmware.hex:i
Run Code Online (Sandbox Code Playgroud)


小智 5

我有同样的问题。正如有人已经提到的,我尝试使用 Python 脚本以 1200 波特率打开和关闭 ACM0 端口。这对我不起作用。然后我收到了一半的建议,尝试切换RTS/DTS,这将进行自动重置。所以最终我在 Linux Mint 18.2 (Sonya) 上找到了解决方案(至少对我来说):

#! /usr/bin/python

import sys
import serial

com = serial.Serial(sys.argv[1], 1200)
com.dtr=False
com.close()


python ./reset.py "/dev/ttyACM0"
Run Code Online (Sandbox Code Playgroud)

dmesg向我展示:

[21850.047120] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
[22093.700327] usb 1-1: USB disconnect, device number 53
[22094.034133] usb 1-1: new full-speed USB device number 54 using xhci_hcd
[22094.175377] usb 1-1: New USB device found, idVendor=2341, idProduct=0036
[22094.175381] usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[22094.175384] usb 1-1: Product: Arduino Leonardo
[22094.175387] usb 1-1: Manufacturer: Arduino LLC
[22094.175964] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
Run Code Online (Sandbox Code Playgroud)


Xer*_*XeX 0

好吧,你几乎自己写了答案。

您需要以 1200 波特率打开与 Arduino 的串行连接,然后关闭该连接。然后 Arduino 将启动至 SAM-BA,并自行重置,现在已准备好执行新程序。

  • 这里有一些内容供您阅读,https://www.arduino.cc/en/main/arduinoBoardLeonardo - 请参阅“自动(软件)重置和引导加载程序启动”部分 (2认同)