Что делает строка "while (! Serial);" в программе Arduino?

Я новичок в Arduino и пробую несколько уроков. Что делает эта строка в программе?

while (! Serial);

, 👍12

Обсуждение

На этот вопрос полностью дан ответ на http://arduino.cc/en/Serial/IfSerial, и он доступен в онлайн-справке по IDE Arduino. Так что это не по теме этого форума., @gbulmer

Этот вопрос, похоже, не по теме, потому что он касается библиотеки Arduino. На этот вопрос полностью дан ответ в справке Arduino IDE. Возможно, его следует разместить на Arduino stackexchange., @gbulmer


1 ответ


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

15

На платах с чипом FT232 или другим чипом USB->последовательного моста (Uno, Mega и т. д.) он абсолютно ничего не делает.

На платах с прямым USB-подключением, таких как Leonardo или Yùn, он ожидает установки активного последовательного соединения с ПК (т. е. открытия последовательного порта с помощью программного обеспечения).

Когда вы открываете последовательный порт платы, такой как Uno или Mega, вся плата обычно сбрасывается*, поэтому открытие последовательного порта позволяет вам увидеть первые биты последовательных данных. На Leonardo и т. д. он не сбрасывается при открытии последовательного порта, поэтому любой последовательный вывод во время функции setup() будет пропущен. Добавление этой строки заставляет плату приостанавливаться, пока вы не откроете последовательный порт, поэтому вы можете увидеть этот начальный бит данных.

*) Если только вы специально не напишете какое-нибудь программное обеспечение, которое не будет выдавать DTR при открытии порта

,

Строго говоря, "Когда вы открываете последовательный порт платы, такой как Uno или Mega, вся плата сбрасывается" - это не правильно. IDE Arduino делает это по умолчанию. Однако простое открытие последовательного порта с хост-компьютера USB не сбрасывает ATmega. Я написал код, который открывает последовательное соединение через USB с хоста, и он не сбрасывает ATmega., @gbulmer

На самом деле это зависит и от ОС, и от драйвера, а не только от программного обеспечения, которое открывает порт., @Majenko

Arduino сбрасывается, когда получает сигнал DTR. Он передается по умолчанию всякий раз, когда я открываю соединение откуда угодно, а не только из IDE Arduino., @BrettAM

В некоторых ОС можно открыть последовательный порт без подтверждения DTR. В других можно настроить порт так, чтобы он не подтверждал DTR при открытии, а только после того, как он был открыт один раз. По умолчанию, как уже упоминалось, IDE всегда явно подтверждает DTR., @Majenko

Я считаю, что возможно открыть FTDI SUB/Serial без утверждения DTR в Windows, OS X и Linux, потому что я это сделал. Это *необязательно*. Поэтому, пожалуйста, обновите ответ, *либо* скажите, что когда *IDE* открывает последовательный порт, плата сбрасывается, *или* что открытие *последовательного монитора* сбрасывает его, *или* что открытие последовательного порта *обычно* сбрасывает плату. Мне все равно, что выбрано. Однако текущий ответ неточен., @gbulmer

@BrettM - какая ОС?, @gbulmer

В Linux вам нужно сначала открыть порт, чтобы настроить порт на отсутствие DTR. Это первое открытие всегда будет сбрасывать плату независимо., @Majenko

Обратите внимание, что если эта строка есть в вашем скетче, вы используете 32u4 или M0 или аналогичный чип со встроенной поддержкой USB, и вы пытаетесь запустить его без подключения к хосту через USB, ваш скетч зависнет навсегда, ожидая готовности Serial. Это распространенная проблема: «Скетч запускается при подключении к ПК, но не при отсутствии подключения»., @Dan Halbert