Как объявить массив char[] с помощью целых чисел?

Кто-нибудь может сказать мне, как объявить переменную char, используя несколько целых чисел?

Мне нужно объявить байтовую информацию для функции shiftOut() как char.

int a = 0;
int b = 1;
int c = 0;
int d = 1;
int e = 1;
int f = 0;
int e = 0;
int f = 1;

char information[] = {"B" + a + b + c + d + e + f};

void setup() {
  Serial.println(information);
}

void loop() {
  shiftOut(pin, pin, MSBFIRST, information);
}

В команде Serial.println(информация); Я хочу вернуть B01011001

Теперь выход я получаю ⸮ ⸮

Конечно, самый простой способ создать это будет:

char information[] = "B01011001";

Но мне нужно изменить отдельные биты в переменной int bit=.

Обратите внимание, что подстановка int bit = with char bit = невозможна для моего кода, использование int значения отдельных битов обязательно. Потому что я использую свой проект с blynk, и там есть функция a = param.asInt ();, param.asChar(); не существует.

Как это сделать?

Спасибо вам за ответы!

, 👍1


1 ответ


1

Я думаю, что вы что-то неправильно поняли в shiftOut(). Он будет передавать ровно 1 байт (или 1 символ). Он не принимает массив в качестве параметра. Я предполагаю, что вы хотите записать 8 бит, которые вы определяете с помощью своего ints, как один байт. Прямое определение at byte будет выглядеть следующим образом:

byte information = 0b00101100;

0b сообщает компилятору, что следующее число закодировано в двоичном формате. Таким образом, у вас есть один байт, который содержит всю вашу информацию (все биты). Тогда вы можете сделать

shiftOut(data_pin, clock_pin, MSBFIRST, information);

(Обратите внимание, что data_pin и clock pin должны быть разными).

Если вы хотите вывести информационную переменную на последовательный номер, показывающий двоичное представление, вы можете использовать соответствующий параметр функции print ().

Serial.print(information, BIN);

Выведет двоичное представление переменной (нули и единицы в виде текста). Итак, чтобы получить "B1011001", вам нужно сделать следующее:

Serial.print("B");
Serial.println(information, BIN);

Обратите внимание, что функция print()/println() удалит все начальные нули.


Как поместить информационный байт вместе с вашим ints? Каждый из них является либо нулем, либо единицей и представляет собой один бит. Таким образом, вы можете использовать побитовые операторы для их объединения:

information = (a << 7) | (b << 6) | (c << 5) | (d << 4) | (e << 3) | (f << 2) | (g << 1) | h;

Для каждого int важен только первый (наименее значимый) бит, так как остальные всегда равны нулю (потому что int может быть только единицей или нулем). Поэтому мы сдвигаем значение int влево на число соответствующего бита минус 1 (таким образом, сдвигая a на 7 мест влево, чтобы поместить его наименее значимый бит в наиболее значимый бит информации. Мы делаем это для всех наших значений int. Затем мы складываем их все вместе в один байт с помощью оператора | (побитовый ИЛИ).

Примечание: Мы не знаем, откуда берутся эти ints. Даже когда вы заявляете, что вам абсолютно нужны эти ints, вы можете организовать их в массив вместо отдельных переменных. Это выглядело бы так:

int int_data[8] = {0, 0, 1, 0, 1, 1, 0, 0};
...
// в функции (например, loop() или setup())
byte information = 0;
for(int i=0;i<8;i++) information |= int_data[7-i] << i;

Это зависит от вас, если вы хотите это сделать.

,