32U4 and Serial

leshak
Offline
Зарегистрирован: 29.09.2011

Как известно, на leonardo, pro micro и проч. платах на базе 32u4 Serial порт может быть, а может и не быть.

Исчезать/появляться Serial может в зависимости от того, открыт/подключен Serial Monitor со стороны компа или нет.

Вообщем-то дока говорит как проверить "доступен ли он в данный момент":

http://arduino.cc/en/Serial/IfSerial

Но... как-то ничего не говорится "а что будет если он пропадет".
Что произойдет если его отключат на ходу, а в коде будет Serial.println()

По идее, раз для этогй ситуации if(Serial) возвращает false (то есть "ноль"), то мы должны иметь null-refference exception и крах системы.
Поэтому я начал писать так
if(Serial)Serial.println();

Как-бы "для безопастности".
Но.... как выяснилось проверка if(Serial) занимает целых 10-миллисекунд.
И если их набросано по коду чуть больше чем "дофига", имеем.... некислый такой притормоз.
Само время выполнения этой проверки говорит о том, что это "нифига не простой указатель". И происходит совсем не простое "отличается ли переменная от нуля".
Явно, arduinoIDE что-то там "химичит за кулисами" и на что-то подменяет это.

Кто-нибудь разбирался "что там под капотом происходит"?
Или Serial.println() будет работать нормально в любом случае и я "просто дую на воду".
А если отключили/подключили... нужно заново Serial.begin() делать?

Вообщем прорабатывал кто-нибудь вопрос "безопасности" работы с Serial в случае 32u4 камней?

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я немного порылся, думаю "разгадка" и некоторые рекомендации по этому поводу, можно найти здесь:
...\Arduino-1.0.5\hardware\arduino\cores\arduino\CDC.cpp
Во всяком случае там есть комментарии на эту тему.

operator bool - это проверка, а чуть выше метод write

Сам не копался, пока нужды не было, хотя тема вполне интересная.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Вот же "ептыть". Про перегрузку операторов и не подумал. Спасибо.
Значит можно, все-таки спокойно юзать Serial.println, null-reffrence не будет

но вот на кой кляп там вот так сделанно:
 

Serial_::operator bool() {
	bool result = false;
	if (_usbLineInfo.lineState > 0) 
		result = true;
	delay(10);
	return result;
} 

В чем кармический смысл ждать 10 миллисекунд прежде чем "огласить результат"?

Премного благодарен... съкономили кусок времени выкапывание.
 

P.S. Еще блин, почему-то нотифай о вашем ответе в тему почему-то не пришел. Чисто случайно заметил что "кто-то ответил".

leshak
Offline
Зарегистрирован: 29.09.2011

Ага. Вы правы по поводу "из комментов ясно зачем". Типа возможная ситуация когда lineStatus уже стал больше нуля, а порт еще не успел открыться.....
Но, блин, как же это "криво" :(

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да, согласен, задержка - это надо в железо-программном комплексе копаться. Сначала я подумал, что это для конструкции в setup:
while(!Serial) {}
Но щас не знаю, прав или нет. Так, интуиция, но тогда точно кривизна.
Даташит надо копать, наверное.