Есть ли существенная разница между возвратами каретки для Arduino?

Serial.write(0x0d); // шестнадцатеричный

Serial.write(13); // ASCII

Serial.write('\r'); // символ

Есть ли более эффективный? Я читал, что это зависит от терминальной программы. Так это означает IDE? (Это мой первый опыт работы с последовательной связью.)

, 👍1

Обсуждение

Это \r, а не /r., @Gerben

Все они идентичны. Но последний наиболее читаем для нас, людей. Поэтому я бы предпочел последний., @Gerben

это зависит от терминальной программы ... нет, это не так. .... терминальная программа получит ASCII CR для каждой из строк, @jsotola


3 ответа


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

0

Как уже упоминалось ранее, они все одинаковы. Вам нужно помнить, что компилятор берет написанный вами читабельный код и превращает его в инструкции, которые может понять процессор. Если вы хотите изучить, как компилятор что-то делает, вы можете скомпилировать программу в шестнадцатеричный файл и затем сравнить. Или, для еще меньшей детализации, но гораздо проще, посмотрите на размер файла, созданного при компиляции в IDE используя только одну строку в функции настройки

write(0x0d)  ----> 1334 bytes
write(13)    ----> 1334 bytes
write('\r')  ----> 1334 bytes

Для этого простого примера мы можем предположить, что все три из них производят один и тот же hex-файл. Существует множество более сложных примеров различных способов выполнить одну и ту же задачу, которые могут производить более или менее эффективный код, но в этом случае компилятор собирается производить тот же набор инструкций для процессора.

Как указано в комментариях, я не говорю, что поскольку они имеют одинаковый размер, они должны быть одинаковым шестнадцатеричным кодом. Поскольку любой записанный один байт даст код того же размера, но не тот же результат. Но при сравнении двух методов, которые, как мы знаем, имеют одинаковую функциональность (0x0d и '\r') и производят двоичный код того же размера, то мы можем предположить, что компилятор сократил их до одного и того же кода.

,

write('\t') приведет к тому же размеру, @Juraj

да, как и любой другой одиночный байт. и не имея возможности проанализировать шестнадцатеричный файл или других способов получить детальное представление о том, насколько эффективен код, вы могли бы сделать вывод, что они одинаково эффективны. Хотя есть много случаев, когда эта идея не будет работать. Это дает новому программисту представление о том, что происходит под капотом., @Chad G


0

Один эффективнее?

после компиляции он одинаков для всех нотаций. Функция и значение одинаковы для всех 3 нотаций.

,

0

Нет никакой разницы между всеми строками кода в вашем вопросе. Все представления означают одно значение, содержащее один байт. Существует только одна реализация Serial::write(), которая имеет uint8_t в качестве параметра. Поэтому все различные представления в любом случае приводят к uint8_t.

,