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

时间:2017-03-25 13:33:33

标签: arduino

我想在莱昂纳多董事会上自己编译和转移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

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

7 个答案:

答案 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: 我认为基本要素是:

  1. 在DTR = ON时以1200波特配置适当的com端口
  2. 关闭DTR。
  3. 具有正确版本的avrdude和avrdude.config的Flash设备。我的版本随我的Nano-every设备的安装一起提供。 对于其他板,可能会有所不同。第1、2行会重置端口,我认为这与主板无关,但是请更改端口号!

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);
}

一切都与时间有关。我真的需要等待串口断开才能关闭串口。

  • 关闭太快没有任何效果。
  • 关闭速度太慢,USB 串口正在重新连接,但端口名称不同。 (例如 /dev/ttyACM0 到 /dev/ttyACM1)。
  • 在我的情况下等待端口重新连接很重要,因为我之后在 QProcess 中调用了 avrdude。

这里是 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