Условия тестирования байтов порта – игнорирование определенных битов?

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

Например, я читаю 8 бит из PORTK. Мне нужно проверить шаблон старших битов. (Скажем, значение байта 207 — биты 7, 6, 3, 2, 1, 0 — высокие.) Биты 4 и 5 меня не волнуют. Они МОГУТ быть высокими или низкими. (Используя терминологию таблицы данных, это «X — все равно».)

Я мог бы использовать if и проверить, равно ли значение 207, 223, 239 или 255, но это кажется беспорядочным и кажется, что есть более простой (и понятный) способ.

Отредактируйте, чтобы добавить: я просмотрел битовые операторы и... что-то подсказывает мне, что я должен/мог бы использовать один из них. Но мне сложно найти, кто бы мне помог.

Спасибо! -Майк

, 👍3


2 ответа


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

7

Вам необходимо использовать булеву арифметику. Используйте оператор AND (&), чтобы объединить входящее значение И значение «маски» (значение битов, которые вас интересуют) и посмотреть, равно ли оно бит маски:

byte wanted = 0b11001110; // 207
byte incoming = 223; // например 11011111

if ((wanted & incoming) == wanted) {
    // что бы ни
}

Оператор AND сравнивает каждый бит байтов по очереди. Если они ОБА равны 1, то результат равен 1. В противном случае результат равен 0. Итак, приведенное выше дает:

wanted:    11001110
incoming:  11011111
AND:       11001110

И результат соответствует «разыскивается». Если бы у вас было какое-то другое значение для входящего, оно могло бы выглядеть так:

wanted:    11001110
incoming:  01011011
AND:       01001010

И вы можете видеть, что результат не совпадает.

,

АХ! Хорошо, это имеет смысл - я бы хотел, чтобы в моем значении «маски» были установлены биты, равные «1», которые меня волнуют, и «0», которые меня не волнуют. Это фактически приведет к тому, что биты «неважно» будут равны 0., @Coyttl

Это верно., @Majenko


2

Есть способы замаскировать неважные моменты. Скажите свой пример: 0b11xx1111. Тогда

incomingByte = Serial.read();
incomingByte = incomingByte || 0b00110000;  // делаем 4, 5 высоким
if (incomingByte == 0b11111111){ 
// получили все 1, сделайте что-нибудь
}
else {
 // получено несколько нулей, делаем что-то еще
}
,