Формат обращения к Serial.println и обязательное ожидание инициализации USB native
- Войдите на сайт для отправки комментариев
Ср, 07/06/2017 - 12:41
1) Увидел в одном примере http://playground.arduino.cc/Main/InternalTemperatureSensor непривычную форму обращения к Serial.println , где описана функция F() и что делает ?
void setup() { Serial.begin(9600); Serial.println(F("Internal Temperature Sensor")); }
2) и в другом примере - почему если USB "native" (что это значит), нужно в течение неопределенного времени ждать пока он инициализируется ( while ... ) ?
void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } }
F() это макрос, он помещает строку, которая у него в скобках, в память программ, а не данных. Помогает иканомить ОЗУ
можно описать переменную во флэше
const char* PROGMEM test = "Globally declared in Flash mem";
а можно написать Serial.println(F("Globally declared in Flash mem"));
лизурьтат будет адинаков.
а native - значит "родной". В данном контексте - HardwareSerial
const char* PROGMEM test = "Globally declared in Flash mem";
а можно написать Serial.println(F("Globally declared in Flash mem"));
лизурьтат будет адинаков.
а native - значит "родной". В данном контексте - HardwareSerial
1) Неожиданно простое имя для макроса. А если я объявлю свою функцию F или макрос, то будет конфликт с той F?
2) Не понял какой смысл вложен в "родной", в чем разница с неродным и почему у такого порта нужно ждать инициализации?
Добавлю к уважаемому DetSinen,
макрос F() может быть использован в любой функции, работающей со строками, а не только в Serial.print()
Строка в макросе F() обязательно должна быть константой, переменные в F() использовать нельзя.
1) Неожиданно простое имя для макроса. А если я объявлю свою функцию F или макрос, то будет конфликт с той F?
Конфликта не будет - вы просто запишете в макрос свое действие и вместо описанного будет выполнятся ваш макрос.