Формат обращения к Serial.println и обязательное ожидание инициализации USB native

Lims
Offline
Зарегистрирован: 07.06.2017

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
                         }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

F() это макрос, он помещает строку, которая у него в скобках, в память программ, а не данных.  Помогает иканомить ОЗУ

можно описать переменную во флэше

const char* PROGMEM test = "Globally declared in Flash mem";

а можно написать Serial.println(F("Globally declared in Flash mem"));

лизурьтат будет адинаков. 

 

а native - значит "родной".  В данном контексте - HardwareSerial

Lims
Offline
Зарегистрирован: 07.06.2017

DetSimen пишет:
F() это макрос, он помещает строку, которая у него в скобках, в память программ, а не данных.  Помогает иканомить ОЗУ можно описать переменную во флэше

const char* PROGMEM test = "Globally declared in Flash mem";

а можно написать Serial.println(F("Globally declared in Flash mem"));

лизурьтат будет адинаков. 

а native - значит "родной".  В данном контексте - HardwareSerial

1) Неожиданно простое имя для макроса. А если я объявлю свою функцию F или макрос, то будет конфликт с той F?

2) Не понял какой смысл вложен в  "родной", в чем разница с неродным и почему у такого порта нужно ждать инициализации?

b707
Offline
Зарегистрирован: 26.05.2017

Добавлю к уважаемому DetSinen,

макрос F() может быть использован в любой функции, работающей со строками, а не только в Serial.print()

Строка в макросе F() обязательно должна быть константой, переменные в F() использовать нельзя.

 

b707
Offline
Зарегистрирован: 26.05.2017

Lims пишет:

1) Неожиданно простое имя для макроса. А если я объявлю свою функцию F или макрос, то будет конфликт с той F?

Конфликта не будет - вы просто запишете в макрос свое действие и вместо описанного будет выполнятся ваш макрос.