Arduino-IDE "while (!Serial)"

У меня вопрос относительно Arduino IDE:

Во многих старых примерах настройки Arduino указано, что функция Serial.begin() всегда должна начинаться с:

Serial.begin(9600); // (или 115200)

while (!Serial) 
 { 
   ; // Подождем, пока подключится последовательный порт
 }

Сейчас я прочитал много комментариев о том, что эта "Wait-функция" больше не нужна??

Это старая процедура, в которой больше нет необходимости, или она все еще важна???

, 👍3


3 ответа


1

Микроконтроллеры с собственным интерфейсом USB создают USB-соединение. Это занимает немного времени. Последовательные распечатки сразу после начала() будут потеряны без ожидания или соединения.

Для плат Uno, Mega, Nano, esp8266/32 и других плат с MCU без встроенной поддержки USB подключение USB осуществляется внешним преобразователем USB-TTL-Serial.

Leonardo, Micro, MKR имеют микроконтроллер со встроенным USB-портом. Некоторые платы с нулевым или M0 в названии имеют только собственный порт USB, некоторые имеют чип отладчика, который также может служить преобразователем USB-TTL-Serial.

!Serial — это конструкция C++, использующая оператор bool(). Тогда реализация — это функция, которая проверяет, готово ли USB-соединение.

Ожидание собственного последовательного порта USB (называемого SerialUSB для некоторых плат) используется в примерах для просмотра отладочных отпечатков из setup(). Но если USB не подключен, он ждет, и скетч не продолжается. Это может сбивать с толку. Поэтому я предпочитаю использовать delay(500) после Serial.begin() на платах с собственным USB.

,

Вы могли бы объяснить еще кое-что. Что, если у Leonardo есть этот код, но он используется с блоком питания без разъема USB?, @Jot

Я работаю над этим :-), @Juraj

У меня в Леонардо есть тайм-аут в одну минуту, а затем код продолжается, независимо от того, последовательный или нет., @Jot

Я до сих пор смеюсь над твоим комментарием Маженко @Juraj. :-), @st2000

"!Serial" работает за счет перегрузки оператора "!" (логическое нет), а не bool(), @iPath ツ

@iPathツ, каков параметр этого перегруженного оператора? Где в классе Serial вы видите перегруженный !?, @Juraj

@Юрай, ты прав. Я не смотрел исходный код., @iPath ツ


1

Это предназначено для плат Arduino с собственным USB, чтобы гарантировать готовность последовательного порта перед продолжением работы. Цикл while не требуется для плат Arduino, где USB не является встроенным в процессор (например, Arduino Uno).

Указывает, готов ли указанный последовательный порт.

На платах с собственным USB, if (Serial) (или if(SerialUSB) на Due) указывает, открыто ли последовательное соединение USB CDC. Для всех остальных плат и портов CDC, отличных от USB, это всегда будет возвращать значение true.

Ссылка: Справочник по Arduino > общение > сериал > если(серийный)

,

Как насчет Wemos D1 Mini и Wemos D32 Pro?? Это то же самое, что и для Arduino Uno??, @Rhino

да, это «нужно» только для нескольких менее распространенных плат Arduino. без каждой платы ESP все будет в порядке., @dandavis


2

Эта функция не устарела. Однако есть и безвозмездное его использование там, где оно на самом деле не нужно.

Использование функции, о которой вы упоминаете, возникло из-за желания сделать платы на базе ATMega32U4 (такие как Leonardo), которые имеют собственный интерфейс USB, действовать аналогично платам ATMega328P и т. д.< /п>

Например, когда вы открываете последовательный порт на Uno, основной MCU сбрасывается, и скетч запускается с самого начала. Когда вы делаете то же самое с Леонардо, этого не происходит. Поэтому, добавив этот фрагмент кода в начало, скетч приостанавливается до тех пор, пока не откроется последовательный порт. Создается впечатление, что плата была сброшена и скетч запущен заново, как в Uno, но это не так.

Размещение цикла while в начале вашего скетча без размышлений о последствиях означает, что ваш скетч может никогда не запуститься. Если для вашей программы требуется последовательное соединение, то это не такая уж проблема. Однако если вы используете последовательный порт только для отладки, то как только вы попытаетесь использовать свой скетч без, когда компьютер откроет последовательный порт, он потерпит неудачу.

Поэтому я бы рекомендовал не использовать этот цикл while, если вы не уверены, что вам нужны эффекты, которые он обеспечивает. То есть приостанавливает работу скетча до тех пор, пока компьютер не откроет последовательный порт.

,