Как проверить подключен сейчас терминал или нет в программе
- Войдите на сайт для отправки комментариев
Пнд, 18/01/2021 - 15:26
Здравствуйте!
плата Arduino Pro Micro
При первом запуске, пока терминал еще ни разу не открывал, все работает. Открываю терминал все работает и сообщения выводятся. Закрываю терминал и все тормозит. Открываю терминал снова - все нормально.
Конструкция:
void loop() {
if (Serial) {
FlagTerminalConnected = true;
} else {
FlagTerminalConnected = false;
}
.....
}
нормально работает только до первого открытия терминала..., потом, даже когда терминал уже закрыт, программа считает Serial - true, и, видимо, пытается туда что-то отослать, лампочки Rx и Tx не моргают. (В программе использую millis() - если это сюда относится)
Программа не должна тормозить из-за отправки чего-либо в Serial. По крайней мере разницы между отправкой в реальный Термниал и "в пустоту" быть не должно. Почему у Вас тормозит (и тормозит ли вообще) не знает никто, кроме Вас, т.к. никто Вашей программы не видел.
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()); } }Уважаемый 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()); } }Изменяю }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); } } }Да, на микре я такое наблюдал: открыт терминал - нет тормозов, закрыт - есть. Не разбирался, но сталкивался. Поди там из-за эмуляции ком-порта такие приключения.
Да и Serial.begin(9600); моей плате вообще не нужен...
Вот некоторые раскопки.
https://forum.arduino.cc/index.php?topic=502792.0
Похоже, если моей ПРО МИКРО один раз показали Serial, то он его все время ищет (даже если он ему и не нужен - ничего не выводим и не вводим) - ДОЛЖОН БЫТЬ!
Господа! Подскажите, пожалуйста, а на NANO V3.0 ATMEGA328P c микро USB эта программа ( if (Serial) { ) работает корректно?
На ATMega328 проблем с терминалом я не наблюдал ни разу.
На Nano нет аппаратного USB, соответственно Serial никак не отслеживает подключение и всегда возвращает true.
У меня "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
Уважаемые Господа!
Благодарю Вас за сотрудничество. Благодаря Вам, ко мне вернулось душевное равновесие, а ноут и Ардуинка остались целыми......, еще пока. Позже выложу маленькую функцию для отладки программы для новичков, может кому пригодится...