Почему запуск последовательного монитора перезапускает скетч?

Если я загружаю какой-либо скетч, который отправляет последовательные данные, я сразу же вижу, как мигают светодиоды TX/RX после загрузки скетча. Если затем я запущу последовательный монитор, скетч перезапустится.

Минимальный скетч, показывающий такое поведение:

void setup()
{
    Serial.begin(9600);
    Serial.println("Setup");
}

void loop()
{
  Serial.println("Loop");
  delay(1000);
}

Протестировано с несколькими платами и версиями IDE для Mac и Windows.

Пример вывода - он возвращается к "Настройке", когда я открываю последовательный монитор:

Restart

Почему это так?

, 👍44

Обсуждение

Я никогда не видел скетча, в котором используется серийный номер, не делающий этого, так что буквально любой скетч., @Cybergibbons

Связанные: *Сброс последовательного порта Arduino в последовательном мониторе и Python*, @Peter Mortensen

Дубликат: *[Почему мой Arduino, кажется, перезагружается каждый раз, когда я открываю последовательный монитор?](http://arduinoprosto.ru/q/4078)*, @Peter Mortensen

У меня есть отдельная проблема. Arduino leostick (и другие) больше не выполняют автоматическую настройку. Как мне его изменить?, @CMCDragonkai

Странный. Я не думаю, что это происходит с platformio или Arduino IDE на моем ноутбуке Linux, но я только что заметил это с pio в Windows. Это ужасная "особенность"., @Eric Duminil


4 ответа


Лучший ответ:

42

Arduino использует сигналы RTS (Запрос на отправку) (и, я думаю, DTR (Терминал передачи данных готов)) для автоматического сброса. Если у вас есть последовательный терминал, который позволяет изменять настройки управления потоком, вы можете изменить эту функциональность.

Терминал Arduino не предоставляет вам много возможностей, и это по умолчанию. Другие позволят вам настроить гораздо больше. Установка параметра "Управление потоком" на " нет " позволит вам подключаться/отключаться от последовательного порта без сброса платы. это весьма полезно для отладки, когда вы хотите иметь возможность просто подключить разъем и просмотреть вывод без необходимости начинать скетч заново.

Другой способ отключить автоматический сброс - это надеть подтягивающий резистор на вывод сброса.

Отключение Автоматического Сброса При Последовательном Подключении

,

Arduino Unos может быть исправлен с помощью конденсатора емкостью 10 мкФ через сброс и GND. Он работает для одной установки, для которой я его использовал до сих пор …, @scruss

Я попробовал использовать [замазку](http://en.wikipedia.org/wiki/PuTTY), подключение к COM-порту, на котором отображается Arduino (в моем случае COM16). Он по-прежнему сбрасывает Arduino, если для параметра "Управление потоком" в соединении/последовательном установлено значение "Нет" (другими параметрами являются "XON/XOFF", "RTS/CTS" и "DSR/DTR"). Я использовал версию 0.60 шпатлевки., @Peter Mortensen

-продолжение: Это было опробовано на Arduino Uno R3., @Peter Mortensen

У Duemilanove и Uno есть трассировка с надписью "СБРОС EN", которая управляет этим поведением. Сотрите эту трассировку, чтобы отключить автоматический сброс. Припаяйте провод через прокладки, чтобы снова включить его., @mhopeng


13

Истина всегда содержится в таблицах данных, схемах и коде:

Arduino UNO фактически использует линию /DTR для запуска сброса, как вы можете видеть на следующей таблице:

reset schematic

,

Ссылка на ваше схематическое изображение разорвана., @linhartr22

Спасибо, я все исправил! Я на самом деле думал, что так было с кэшированием изображений, но, похоже, это не так, поэтому я обязательно сохраню его всегда включенным., @zmo

готово, спасибо за подсказку (на самом деле у меня был свой собственный сайт на 10 дней, потому что я выполнял некоторые ремонтные работы, которые были временными), @zmo

Да, но что на самом деле происходит? Связано ли это с тем, как запрограммирован ATmega16U2 (утверждение низкого уровня PD7 при открытии COM-порта программой?)? Или следуя какому-то стандарту DTR?). И в чем смысл C5? - будет ли он сбрасывать основной процессор для обоих переходов (от низкого к высокому и от высокого к низкому)? Какова приблизительная длительность импульса (в микросекундах) на выводе сброса основного процессора и как он выглядит?, @Peter Mortensen

Хорошо, я записал импульс при сбросе при последовательном подключении: [https://i.stack.imgur.com/KV4Oa.png](https://i.stack.imgur.com/KV4Oa.png). Вы можете использовать его в своем ответе., @Peter Mortensen

Как это можно назвать ответом? Что мы предполагаем делать с этой информацией????, @GeneCode

эй, ребята, это значит, что я должен перерезать этот провод?, @GeneCode

если это то, чего ты хочешь, да :), @zmo

Что может сделать RESET-EN? Почему он там? Похоже, что это не может иметь никакого эффекта (похоже, короткое замыкание). Или это ошибка в схеме? Каково же объяснение? Можете ли вы подробнее изложить свой ответ (этот и другие моменты)?, @Peter Mortensen

На самом деле он ничего не делает, как вы можете видеть из схем. Причина, по которой это происходит, заключается в том, что вы можете обрезать линию DTR между ножками RESET-EN, чтобы отключить автоматический сброс, и если вы хотите снова включить ее, то вы можете спаять вместе две прокладки RESET-EN., @zmo


2

Это устраняет проблему

import os
import sys
import termios
import fcntl

        self.fd = sys.stdin.fileno()

        # Прекратить сброс ардуино при последовательном подключении

        self.newattr = termios.tcgetattr(self.fd)
        self.newattr[2] = self.newattr[2] & ~termios.HUPCL
        termios.tcsetattr(self.fd, termios.TCSANOW, self.newattr)
,

Пожалуйста, объясните, почему это устраняет проблему., @Quazi Irfan


2

Arduino использует линию DTR (терминал передачи данных готов)

Таким образом, с помощью последовательного монитора Arduino невозможно изменить перезапуск при установке соединения rs232.

Но я использую, например, бесплатную программу "HTerm" (под Windows). По умолчанию он не использует сигнал DTR. Тем временем я перешел на бесплатный "CoolTerm" (немного более удобный...): вы должны отключить "DTR Выключен" в разделе "Параметры подключения". В Linux я использую "moserial". В разделе "Настройка портов" вы должны отключить "рукопожатие" ;-)

Этот способ более удобен для меня, чем регулировка контакта СБРОСА. Кроме того, это хорошее преимущество, позволяющее сохранить все данные в файле журнала для последующего анализа…

,