Возобновление последовательного соединения после сна на Arduino M0

Для отладки я хочу, чтобы мое последовательное соединение возобновилось после sleep. After запуска LowPower.sleep() из библиотеки <ArduinoLowPower.h>, я не получаю никаких новых последовательных сообщений в последовательном мониторе.

Несколько факторов, кажется, в игре (которые я перечислил внизу), и я разработал частичное решение, но это не здорово, потому что для возобновления последовательного режима требуется несколько длительных искусственных задержек около 1 секунды после каждого сна. Итак, повторюсь, мой вопрос заключается в том, как я могу получить последовательный режим работы после спящего микроконтроллера без необходимости вставлять длинные задержки.

Для фона я использую Adafruit Feather M0, который, как я думаю , на самом деле использует SerialUSB и автоматически преобразует последовательные команды в это в соответствии с руководством, но я не уверен, что это означает.

Вот некоторые вещи, которые я изучил:

  1. COM-порт: Одним из факторов является то, что Arduino отключается от компьютера My Windows 10 в спящем режиме и снова подключается, когда он просыпается иногда на другом COM-порту. Использование термина Tera программы вместо последовательного монитора Arduino IDE, кажется, держит его на том же COM-порту.

  2. Последовательный сброс и завершение: Как отмечается в моем примере кода, обе эти команды кажутся необходимыми перед сном, иначе я не буду получать новые сообщения после сна.

  3. Задержка: Похоже, что arduino может посылать сообщения сразу после пробуждения, которые Tera Term не увидит. Я должен поставить задержку в 1 полную секунду после пробуждения, иначе я не увижу сообщений.

Вот какой код я уже пробовал.

#include <ArduinoLowPower.h>

void setup() {
  Serial.begin(115200);
  while(!Serial){delay(10);}
  Serial.println("start");
}

void loop() {

  Serial.println("");
  Serial.println("sleep");
  Serial.flush(); //если эта строка закомментирована, то будет показан только один цикл "сна" 
  Serial.end(); //если эта строка закомментирована, то будет показан только один цикл "сна" 
  //delay(2000); //похоже, ничего такого закомментированного не исправляет
  LowPower.sleep(2000);
  delay(1000); //at 750 пропускает некоторые "бодрствующие" сообщения
  //Serial.begin(115200); //эта строка, похоже, ничего не исправляет, поэтому закомментирована
  Serial.println("проснулся");

Выход:

start

sleep
awake

sleep
awake

sleep
awake

, 👍1

Обсуждение

в то время как (!Серийный номер);?, @Juraj

так что у меня есть шанс открыть серийный номер на моем компьютере, прежде чем он сойдет с ума, @rfii