Как прочитать и Serial.print содержимое (текущие значения) 8-битного регистра?
В настоящее время я использую:
ADMUX = 0b01100000; //пример for (int i = 7; i >= 0; i--) { Serial.print (bitRead (ADMUX, i)); }
Это правильно печатает:
01100000
Но есть ли более простой способ?
Прежде чем придумать описанный выше цикл for, я пробовал использовать только:
ADMUX = 0b01100000; //example
for (int i = 7; i >= 0; i--) {
Serial.print(bitRead(ADMUX, i));
}
Что-то еще, о чем я не знаю?
@Gaai, 👍0
Обсуждение1 ответ
Другой вариант:
#include <LibPrintf.h>
printf("%.8b", ADMUX); // печатает: 0110000
Библиотека LibPrintf.h входит в стандартную комплектацию плат ESP. %b означает двоичный файл. .8 для 8 знаков после запятой, что добавляет ведущие нули ко всем усеченным (двоичным) числам.
Это становится *проще, если вы хотите напечатать имя переменной вместе с ним, например:
printf("ADMUX: %.8b", ADMUX);
Результаты:
ADMUX: 01100000
*Проще в том смысле, что теперь занимает всего одну строку кода.
Там, где вопрос был помечен UNO и NANO, всем, кто рассматривает этот маршрут, может быть полезно знать следующее. Минимальная тестовая среда для рассматриваемого кода приводит к тому, что _Sketch использует **1542 байта (4%)** пространства для хранения программы. Максимум 32256 байт._ То же самое с кодом в ответе приводит к тому, что _Sketch использует **11456 байт (35%)** места для хранения программы. Максимум 32256 байт._, @timemage
Вы правы, конечно. И ответ в любом случае обман, поскольку он использует полную библиотеку. Вы можете добиться того же одного вкладыша с помощью простой функции для нескольких вызовов. Но подумал, что это стоит упомянуть, тем более что библиотека является стандартной для esp-досок, даже если она не помечена. Может быть хорошим знанием для людей, которые хотят сделать это на этих платах., @Gaai
Или только то, что стоимость как бы амортизируется (через не снимается) за счет _более_ использования LibPrintf. Я не особо задумывался о том, обман это или нет. Только вот об этом может быть особенно важно знать. Любая реализация printf — зверь. Однако на проекте любого серьезного размера avr-libc (или что-то еще) часто уже, так сказать, оплачено тем, что хотя бы раз использовалось в чужом коде, нравится вам это или нет., @timemage
Итак, если какой-либо printf или что-то подобное уже используется где-то еще (в любом случае занимает это дорогостоящее пространство памяти), вы также можете использовать его для этого? Это что ты имеешь в виду? (пришлось искать амортизированные, учась каждый день;), @Gaai
Нет, это не так просто. Это происходит **за** реализацию printf
. Цена за звонок для любой отдельной реализации printf()
_огромна_, когда вы используете ее _один раз_. Таким образом, в худшем случае у вас есть одно использование avr-libc и одно использование libprintf. Кроме того, авторы [задокументировали](https://github.com/embeddedartistry/arduino-printf), как вы можете удалить функции, чтобы уменьшить размер библиотеки. Я могу сказать гораздо больше об этом, имеющем отношение к вашему ответу., @timemage
- avrdude ser_open() can't set com-state
- Почему я не могу распечатать значения логических переменных (0 и 1) с помощью функции println?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
- Arduino Uno: avrdude: stk500_recv(): программатор не отвечает
- В чем разница между delay() и delaymicroseconds()
- Программирование Arduino на Паскале?
- Как синхронизировать несколько ардуино?
Вы спрашиваете, потому что пытаетесь избежать написания цикла самостоятельно, потому что вам интересно, возможно ли это сделать с меньшим количеством движущихся частей (независимо от того, сделано ли это в вашем коде или в чьем-то еще), или вы спрашиваете, потому что вы находитесь под впечатление, что без встроенной вещи вам нужно было бы писать цикл каждый раз, когда вы хотите напечатать значение таким образом?, @timemage
Я тоже не совсем понимаю, о чем вы спрашиваете ;), @Gaai
Я новичок в использовании таймеров и регистров, недавно прочитал и поэкспериментировал, и я просто хочу знать, какой предпочтительный или самый элегантный способ сделать это. Я сам не нашел здесь ответа. Итак, я попробовал вышеуказанные способы. Может быть, есть что-то лучше. Если есть, хотелось бы узнать ;), @Gaai
itoa(n, buffer, 2)
не является частью C++, но доступен в Arduino и выполняет те же функции, что иSerial.println(num, BIN);
. Перед использованием необходимо определить буфер, напримерchar buffer[33]
, так что это не намного проще., @hcheungЕсли вы посмотрите, как определяется [print_number](https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/Print.cpp#L203-L221), который вызывается всеми
Serial.print( число, основание)
, и как [binary](https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/binary.h) определяется в Arduino Core, на самом деле нет более простого способа . Просто определите цикл for..loop как функциюprint_binary()
и используйте ее, если вам нужно., @hcheung«лучше» (без квалификации) и «предпочтительно» очень контекстуальны и в основном основаны на мнении, что является чем-то, для чего вопросы закрываются на стеке. Итак, если у вас есть способ сделать вопрос более конкретным или дать объективный ответ, вероятно, это хорошая идея., @timemage
@timemage Я спросил «проще»., @Gaai
@hcheung itoa(), за которым следует Serial.print, по-прежнему не имеет начальных нулей. Так ведь то же самое. Спасибо за ваш вклад. Доволен циклом for, а затем для печати. И я думаю, что для других целей меня не должны беспокоить пропущенные начальные нули, поскольку я полагаю, что они в любом случае не имеют значения при чтении или сравнении., @Gaai
@Gaai, я заметил. это часть того, что вызвало мой первоначальный вопрос. может это только я., @timemage