Метод перебора битов в байте, отправленном по последовательному каналу.

В моем текущем проекте, который интегрирует микросхему Arduino/avr с Raspberry-Pi и каждый из которых взаимодействует через последовательный порт, я хочу отправить байт данных в Arduino из RPi, который затем будет повторяться понемногу. кусочек.

Каждый бит представляет настройку. Если бит равен 0, то Arduino выключит соответствующее устройство, если бит равен 1, то Arduino включит это соответствующее устройство. Например, такой байт, как: 01100110, будет означать, что Arduino придется выключить четыре устройства и включить четыре устройства.

Я ищу информацию о том, как преобразовать байт в последовательный номер и побитно перебирать этот байт, чтобы Arduino принимала решения на основе значения каждого бита.

Прошу прощения за недостаток технических подробностей, я воздерживаюсь от использования терминов, которые до сих пор мне непонятны.

С уважением.

, 👍1

Обсуждение

ваш вопрос касается программирования на C++..... он не имеет отношения конкретно к Arduino, @jsotola


1 ответ


2

Во всех приведенных ниже примерах value — это значение байта

LSB -> MSB - таким образом, 00001111 включит первые 4 устройства и выключит последние 4

for(int i = 0, mask = 1; i < 8; i++, mask = mask << 1)
{
    if (value & mask) 
    {
        // бит включен
    }
    else
    {
        // бит выключен
    }
}

В качестве альтернативы вы можете сделать следующее, но значение будет изменено

for(int i = 0; i < 8; i++, value = value >> 1)
{
    if (value & 1) 
    {
        // бит включен
    }
    else
    {
        // бит выключен
    }
}

Действуем наоборот в каждом байте:
MSB -> LSB - поэтому 00001111 выключит первые 4 устройства и включит последние 4

for(int i = 0, mask = 128; i < 8; i++, mask = mask >> 1)
{
    if (value & mask) 
    {
        // бит «i» включен
    }
    else
    {
        // бит «i» выключен
    }
}

В качестве альтернативы вы можете сделать следующее, но значение будет изменено

for(int i = 0; i < 8; i++, value = value << 1)
{
    if (value & 128) 
    {
        // бит включен
    }
    else
    {
        // бит выключен
    }
}
,