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

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

Serial.write(13); // ASCII

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

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

, 👍1


3 ответа


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

0

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

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

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

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

,

0

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

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

,

0

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

,