Как проверить подключен сейчас терминал или нет в программе

vlport
Offline
Зарегистрирован: 05.12.2020

Здравствуйте!

плата Arduino Pro Micro

При первом запуске, пока терминал еще ни разу не открывал, все работает. Открываю терминал все работает и сообщения выводятся. Закрываю терминал и все тормозит. Открываю терминал снова - все нормально.

Конструкция:

void loop() {
 
if (Serial) {
      FlagTerminalConnected = true;
    } else {
      FlagTerminalConnected = false;
}
.....
}
 
нормально работает только до первого открытия терминала..., потом, даже когда терминал уже закрыт, программа считает Serial - true, и, видимо, пытается туда что-то отослать, лампочки Rx и Tx не моргают. (В программе использую millis() - если это сюда относится)
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Программа не должна тормозить из-за отправки чего-либо в Serial. По крайней мере разницы между отправкой в реальный Термниал и "в пустоту" быть не должно. Почему у Вас тормозит (и тормозит ли вообще) не знает никто, кроме Вас, т.к. никто Вашей программы не видел.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vlport, на примере stm32 (у негго, как и у Micro аппаратный USB) Serial вполне адекватно возвращает состояние подключения.

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

int ledState = LOW;             // ledState used to set the LED
unsigned long LED_previousMillis = 0;        // will store last time LED was updated
unsigned long LED_interval = 1000;           // interval at which to blink (milliseconds)
unsigned long COM_previousMillis = 0;
unsigned long COM_interval = 5000;
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - LED_previousMillis >= LED_interval) {
    LED_previousMillis = currentMillis;
    digitalWrite(LED_BUILTIN, ledState = !ledState);
  }
  if(!Serial)  LED_interval = 50;  else  LED_interval = 150;
  static int counter = 0;
  if (currentMillis - COM_previousMillis >= COM_interval) {
    COM_previousMillis = currentMillis;
    Serial.print('c');
    Serial.println(counter++);
  }
  if(Serial.available()) {
    Serial.write('a');
    Serial.write(Serial.read());
  }
}

 

vlport
Offline
Зарегистрирован: 05.12.2020

Уважаемый andriano!

Благодарю Вас за помощь. У меня одна единственная плата Ардуино ПРО МИКРО 5 вольт (LED_BUILTIN - нет, поэтому внешний LED на pin 9).

Моя проблема возникает на третьем шаге:

1 шаг: Заливаем программу, терминал не запущен - диод на 9 - pin очень быстро моргает - ПРАВИЛЬНО. if (!Serial)  LED_interval = 0;  else  LED_interval = 5000; - работает.

2 шаг: Запускаем терминал - диод на 9 - pin моргает с интервалом 5 секунды - ПРАВИЛЬНО. if (!Serial)  LED_interval = 0;  else  LED_interval = 5000; ОТРАБОТАЛ. в терминал выводится 'c' и Тх - моргает.

3 шаг: Закрываем терминал - Tx - НЕ МОРГАЕТ - видимо, плата понимает, что терминала нет, но if (!Serial) НЕ РАБОТАЕТ - диод на 9 - pin моргать с интервалом  около 6 секунд! Откуда 6 и почему моргает с интервалом? - ЗАСАДА!

4 шаг: Снова запускаем терминал - диод на 9 - pin моргает с интервалом 5 секунды - ПРАВИЛЬНО...

Таким образом if (!Serial) работает только ОДИН РАЗ...

int ledState = LOW;             // ledState used to set the LED
unsigned long LED_previousMillis = 0;        // will store last time LED was updated
unsigned long LED_interval = 5000;           // interval at which to blink (milliseconds)

int Led_pin = 9;

void setup() {

  pinMode(Led_pin, OUTPUT);
  Serial.begin(9600);

}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - LED_previousMillis >= LED_interval) {
    LED_previousMillis = currentMillis;
    digitalWrite(Led_pin, ledState = !ledState);
  }
  if (!Serial)  {
    LED_interval = 0;
  } else {
    LED_interval = 5000;

    Serial.print('c');
    delay (1000);
    if (Serial.available()) {
      Serial.write('a');
      Serial.write(Serial.read());

    }
  }

 

 

 

vlport
Offline
Зарегистрирован: 05.12.2020

Изменяю }else{ (в начало добавил char serialData;).... "StopSerial" - печатает, но Serial.end(); - НЕ ВЫПОЛНЯЕТСЯ... Видимо архитектура моей платы Ардуино ПРО МИКРО (типа Леонардо) не дружит с библиотекой Serial


    LED_interval = 5000;

    Serial.print('c');
    delay (1000);
    if (Serial.available()) {
      Serial.write('a');
      serialData = Serial.read();
      Serial.write(serialData);
      if (serialData == 'q') {
        Serial.println("q");
        Serial.print("StopSerial");
        
        Serial.flush();
        Serial.end();
        delay(1000);
        //Serial.begin(9600);
        //delay(1000);
      }

    }
  }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, на микре я такое наблюдал: открыт терминал - нет тормозов, закрыт - есть. Не разбирался, но сталкивался. Поди там из-за эмуляции ком-порта такие приключения.

vlport
Offline
Зарегистрирован: 05.12.2020

Да и Serial.begin(9600); моей плате вообще не нужен...

sadman41
Offline
Зарегистрирован: 19.10.2016

Вот некоторые раскопки.

https://forum.arduino.cc/index.php?topic=502792.0

vlport
Offline
Зарегистрирован: 05.12.2020

Похоже, если моей ПРО МИКРО один раз показали Serial, то он его все время ищет (даже если он ему и не нужен - ничего не выводим и не вводим) - ДОЛЖОН БЫТЬ!

Господа! Подскажите, пожалуйста, а на NANO V3.0 ATMEGA328P c микро USB эта программа ( if (Serial) { ) работает корректно?

sadman41
Offline
Зарегистрирован: 19.10.2016

На ATMega328 проблем с терминалом я не наблюдал ни разу.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

На Nano нет аппаратного USB, соответственно Serial никак не отслеживает подключение и всегда возвращает true.

vlport
Offline
Зарегистрирован: 05.12.2020

У меня "Pro Micro ATmega32U4 5V 16 МГц заменить ATmega328 для Arduino Pro Mini с 2 Row штыревые для Leonardo Mini Usb Интерфейс"... - почти ATmega328..., но на плате ПРО МИКРО... типа Леонардо.

Уважаемый andriano!

Вроде-как есть с mini usb... Но как выбрать процессор 328P-AU - 213 руб. или 328 P-MU - 259 руб. - чуть дороже и микросхем побольше...

ззhttps://aliexpress.ru/item/4001245541979.html?spm=a2g0o.productlist.0.0.39a01dd7ZPn8GG&s=p&ad_pvid=202101181111554898398729869440000340075_3&algo_pvid=c497e2d4-109f-49d9-b1a9-baaacd4c8aaf&algo_expid=c497e2d4-109f-49d9-b1a9-baaacd4c8aaf-2&btsid=0b8b034516109971156303583e522a&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_&sku_id=10000015445386155

Уважаемые Господа!

Благодарю Вас за сотрудничество. Благодаря Вам, ко мне вернулось душевное равновесие, а ноут и Ардуинка остались целыми......, еще пока. Позже выложу маленькую функцию для отладки программы для новичков, может кому пригодится...