我想在莱昂纳多董事会上自己编译和转移Arduino程序。
Arduino官方IDE的一切都很好用。我已经为编译和字节码传输启用了详细模式。
我可以看到每个命令行。 我想了解每一行。
除了最后一步,一切都很好:用avrdude转移。 如果我输入完全相同的命令,我会收到错误:
.avrdude: butterfly_recv(): programmer is not responding
如果我使用Arduino IDE上传代码,则不会出现此错误。
我可以看到一个区别 - Arduino IDE在avrdude调用之前显示这一行:
Forcing reset using 1200bps open/close on port /dev/cu.usbmodem1431
所以我的问题是如何通过命令行重置?
答案 0 :(得分:5)
为了从Windows上传,我为avrdude制作了bat文件包装器。
它使用WMI识别Leonardo COM端口,使用mode命令将此COM端口重置为1200波特,然后识别引导加载程序COM端口并调用avrdude。
固件应该放在firmware.hex上,但可以更改为从命令行提供
代码在此处使用GitHub repo https://github.com/p1ne/arduino-leonardo-uploader
或以下:
// This doesn't work
return
gulp.src(styles)
.pipe(minify())
.pipe(concat('libs.min.css'))
.pipe(gulp.dest('public/assets/css'));
// This works
return gulp.src(styles)
.pipe(minify())
.pipe(concat('libs.min.css'))
.pipe(gulp.dest('public/assets/css'));
答案 1 :(得分:3)
我在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[@]}"
while
循环就是诀窍!一旦Arduino端口重新上线,它就会继续进行。
这是我为这个项目编写的Makefile的一部分: github.com/gibatronic/sesame
答案 2 :(得分:0)
嗯,你自己写的答案很多。您需要在波特1200打开到Arduino的串行连接,然后关闭连接。然后,Arduino将启动进入SAM-BA,并重置自己,现在已准备好接受新程序。
答案 3 :(得分:0)
在Windows上,在命令提示符下,相同的解决方案,稍有不同的批处理文件。 同时确定引导加载程序com端口。 请注意,只有连接的Leonardo应该连接!!
@echo off
echo Upgrade procedure starting.
if %1.==. goto error
set hexfile=%1
set comportA=NONE
set comportB=NONE
if not exist %hexfile% goto error
for /f "usebackq" %%B in (`wmic path Win32_SerialPort Where "Caption LIKE '%%Leonardo%%'" Get DeviceID ^| FIND "COM"`) do set comportA=%%B
if %comportA%==NONE goto nodevice
echo Com Port for Arduino device is detected as %comportA%.
echo Reset Arduino into bootloader
mode %comportA%: baud=12 > nul
timeout 2 > nul
for /f "usebackq" %%B in (`wmic path Win32_SerialPort Where "Caption LIKE '%%Leonardo%%'" Get DeviceID ^| FIND "COM"`) do set comportB=%%B
if %comportB%==NONE goto nobldevice
echo Com Port for Arduino bootloader device is detected as %comportB%.
echo.
echo Starting AVR Downloader/UploaDEr.....
avrdude -pm32u4 -cavr109 -D -P%comportB% -b57600 -Uflash:w:%hexfile%
goto upgradedone
:nodevice
echo No matching module found, you should connect the module you want to upgrade.
goto end
:nobldevice
echo Reset into bootloader failed, please try again...
goto end
:error
Echo Missing parameter or file, you should provide the full filename of an existing .hex file you want to use.
goto end
:upgradedone
echo.
echo Upgrade done!
:end
答案 4 :(得分:0)
我遇到了同样的问题。正如有人已经提到的那样,我尝试在波特率1200处使用python脚本打开和关闭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”
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
答案 5 :(得分:0)
我将它用于每个Nano: 我认为基本要素是:
c:\ windows \ system32 \ mode.com com6:baud = 1200 dtr = on
c:\ windows \ system32 \ mode.com com6:dtr = off
C:\ Users \ Ludo \ AppData \ Local \ Arduino15 \ packages \ arduino \ tools \ avrdude \ 6.3.0-arduino17 / bin / avrdude -CC:\ Users \ Ludo \ AppData \ Local \ Arduino15 \ packages \ arduino \ tools \ avrdude \ 6.3.0-arduino17 / etc / avrdude.conf -v -patmega4809 -cjtag2updi -PCOM6 -b115200 -e -D -Uflash:w:C:\ Users \ Ludo \ AppData \ Local \ Temp \ arduino_build_385557 / sketch_dec11a.ino.hex:i -Ufuse2:w:0x01:m -Ufuse5:w:0xC9:m -Ufuse8:w:0x00:m {upload.extra_files}
答案 6 :(得分:0)
我在使用 arduino leonardo 时遇到了同样的问题。
我想与想要使用 Qt 解决此问题的人分享我的解决方案。
这是准备好复制和粘贴的解决方案,同时还要注意超时:
#include <QtCore/QString>
#include <QtCore/QDebug>
#include <QtCore/QThread>
#include <QtCore/QElapsedTimer>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
bool forceResetComPort(const QString& portName)
{
QSerialPort serial;
serial.setPortName(portName);
serial.setBaudRate(1200);
qDebug() << "Forcing reset using 1200bps open/close on port ") << portName;
if(!serial.open(QIODevice::ReadWrite))
return false;
// This seems optional
serial.setDataTerminalReady(false);
qDebug() << "Waiting for the new upload port...";
QElapsedTimer timeoutWatcher;
qint64 timeoutMs = 10000;
bool isPortPresent = true;
const auto fetchIsPortPresent = [&]() -> bool
{
const auto ports = QSerialPortInfo::availablePorts();
for(const auto& info : ports)
{
if(info.portName() == serial.portName())
return true;
}
return false;
};
timeoutWatcher.start();
// Wait for port to disconnect
while(isPortPresent && !timeoutWatcher.hasExpired(timeoutMs))
{
isPortPresent = fetchIsPortPresent();
if(isPortPresent)
QThread::msleep(1);
}
serial.close();
// Wait for port to reconnect
while(!isPortPresent && !timeoutWatcher.hasExpired(timeoutMs))
{
isPortPresent = fetchIsPortPresent();
if(!isPortPresent)
QThread::msleep(1);
}
return !timeoutWatcher.hasExpired(timeoutMs);
}
一切都与时间有关。我真的需要等待串口断开才能关闭串口。
这里是 dmesg:
[ 8566.623621] cdc_acm 1-8:1.0: failed to set dtr/rts
[ 8566.979697] usb 1-8: new full-speed USB device number 21 using xhci_hcd
[ 8567.133193] usb 1-8: New USB device found, idVendor=2341, idProduct=0036, bcdDevice= 0.01
[ 8567.133197] usb 1-8: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[ 8567.133199] usb 1-8: Product: Arduino Leonardo
[ 8567.133200] usb 1-8: Manufacturer: Arduino LLC
[ 8567.134820] cdc_acm 1-8:1.0: ttyACM0: USB ACM device