32U4 and Serial
- Войдите на сайт для отправки комментариев
Как известно, на 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 камней?
Я немного порылся, думаю "разгадка" и некоторые рекомендации по этому поводу, можно найти здесь:
...\Arduino-1.0.5\hardware\arduino\cores\arduino\CDC.cpp
Во всяком случае там есть комментарии на эту тему.
operator bool - это проверка, а чуть выше метод write
Сам не копался, пока нужды не было, хотя тема вполне интересная.
Вот же "ептыть". Про перегрузку операторов и не подумал. Спасибо.
Значит можно, все-таки спокойно юзать Serial.println, null-reffrence не будет
но вот на кой кляп там вот так сделанно:
В чем кармический смысл ждать 10 миллисекунд прежде чем "огласить результат"?
Премного благодарен... съкономили кусок времени выкапывание.
P.S. Еще блин, почему-то нотифай о вашем ответе в тему почему-то не пришел. Чисто случайно заметил что "кто-то ответил".
Ага. Вы правы по поводу "из комментов ясно зачем". Типа возможная ситуация когда lineStatus уже стал больше нуля, а порт еще не успел открыться.....
Но, блин, как же это "криво" :(
Да, согласен, задержка - это надо в железо-программном комплексе копаться. Сначала я подумал, что это для конструкции в setup:
while(!Serial) {}
Но щас не знаю, прав или нет. Так, интуиция, но тогда точно кривизна.
Даташит надо копать, наверное.