首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我怎么能强迫Arduino Leonardo用AVRDUDE重置?

我怎么能强迫Arduino Leonardo用AVRDUDE重置?
EN

Stack Overflow用户
提问于 2017-03-25 13:33:33
回答 7查看 7.5K关注 0票数 10

我想自己在莱昂纳多的董事会上编译和传输一个阿杜诺程序。

在Arduino官方IDE中,一切都很好。我已经为编译和字节码传输启用了详细模式。

我可以看到每个命令行。

我想理解每一行。

除了最后一步,一切都很好:使用AVRDUDE进行传输。如果键入完全相同的命令,则会得到一个错误:

代码语言:javascript
运行
复制
.avrdude: butterfly_recv(): programmer is not responding

如果我用Arduino IDE上传代码,则不存在此错误。

我看到了一个不同之处- Arduino IDE在AVRDUDE调用之前显示了这一行:

强制使用1200 bps打开/关闭端口/dev/cu.usbmodem1431重置

如何通过命令行进行重置?

EN

Stack Overflow用户

发布于 2021-02-09 12:17:16

我和arduino leonardo也有同样的问题。

我想分享我的解决方案给想要解决这个问题的人使用Qt。

下面是可以复制和粘贴的解决方案,还可以处理超时问题:

代码语言:javascript
运行
复制
#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 1)。
  • 在我的情况下,等待端口重新连接是很重要的,因为之后我在QProcess中调用avrdude。

这是dmesg:

代码语言:javascript
运行
复制
[ 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
票数 0
EN
查看全部 7 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43016993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档