Условия тестирования байтов порта – игнорирование определенных битов?
Поскольку я новичок в тестировании условий байтов и битов, я чувствую, что должен быть лучший способ проверки условий/значений в байте (читанном из порта).
Например, я читаю 8 бит из PORTK. Мне нужно проверить шаблон старших битов. (Скажем, значение байта 207 — биты 7, 6, 3, 2, 1, 0 — высокие.) Биты 4 и 5 меня не волнуют. Они МОГУТ быть высокими или низкими. (Используя терминологию таблицы данных, это «X — все равно
».)
Я мог бы использовать if и проверить, равно ли значение 207, 223, 239 или 255, но это кажется беспорядочным и кажется, что есть более простой (и понятный) способ.
Отредактируйте, чтобы добавить: я просмотрел битовые операторы и... что-то подсказывает мне, что я должен/мог бы использовать один из них. Но мне сложно найти, кто бы мне помог.
Спасибо! -Майк
@Coyttl, 👍3
2 ответа
Лучший ответ:
Вам необходимо использовать булеву арифметику. Используйте оператор 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
И вы можете видеть, что результат не совпадает.
Есть способы замаскировать неважные моменты. Скажите свой пример: 0b11xx1111. Тогда
incomingByte = Serial.read();
incomingByte = incomingByte || 0b00110000; // делаем 4, 5 высоким
if (incomingByte == 0b11111111){
// получили все 1, сделайте что-нибудь
}
else {
// получено несколько нулей, делаем что-то еще
}
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Как сбросить или отформатировать Arduino?
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Arduino Due vs Mega 2560
- Как получить уникальный идентификатор для всех плат Arduino?
- Почему я получаю avrdude: stk500v2_ReceiveMessage(): timeout error when uploading to Arduino Mega?
- Тайм-аут связи Arduino Mega с ошибкой программатора
АХ! Хорошо, это имеет смысл - я бы хотел, чтобы в моем значении «маски» были установлены биты, равные «1», которые меня волнуют, и «0», которые меня не волнуют. Это фактически приведет к тому, что биты «неважно» будут равны 0., @Coyttl
Это верно., @Majenko