我想在莱昂纳多董事会上自己编译和转移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)
所以我的问题是如何通过命令行重置?
我在 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 的一部分。
为了从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)
好吧,你几乎自己写了答案。
您需要以 1200 波特率打开与 Arduino 的串行连接,然后关闭该连接。然后 Arduino 将启动至 SAM-BA,并自行重置,现在已准备好执行新程序。
| 归档时间: |
|
| 查看次数: |
2860 次 |
| 最近记录: |