Разделить полученный сигнал на отдельные пакеты
- Войдите на сайт для отправки комментариев
Пт, 04/03/2022 - 16:15
Приветствую всех. Подскажите пожалуйста каким способом можно решить мою проблему.
Через ИК-датчик на ардуино я отправляю команду с некого пульта.
На ардуино приходит команда в 16ричной системе 1DCF, она же в двоичной 1110111001111. Я знаю, что в этой команде заложены 3 переменных (условно назову их Byte1, Byte2, Byte3. Byte1=1110111, Byte2=00 и Byte3=1111. Как мне в программе разделить получаемый код на части, чтобы я мог сравнивать значения этих байтов с нужными?
#include <IRremote.h> // подключаем библиотеку для IR приемника
IRrecv irrecv(11); // указываем пин, к которому подключен IR приемник
decode_results results;
int code;
void setup() {
irrecv.enableIRIn(); // запускаем прием инфракрасного сигнала
Serial.begin(9600); // подключаем монитор порта
pinMode(11, INPUT); // пин 11 будет входом (англ. «intput»)
}
void loop() {
if (irrecv.decode(&results)) // если данные пришли выполняем команды
{
Serial.println(results.value, HEX); // отправляем полученные данные на порт
irrecv.resume(); // принимаем следующий сигнал на ИК приемнике
}
}
битовыми операциями, типа
Можете пожалуйста поподробнее показать, как это будет выглядеть для всех 3х пакетов?
Может так? но не уверен
а поучиться/почитать не желаете?
Битовые операции в си (&, |, ^, ~, <<, >>) (learnc.info)
byte1 у вас сдвиг вправо на 6
byte2 сдвиг вправо и логическая И для обнуления старших битов
byte3 соответственно логическая И для обнуления старших битов
Спасибо за помощь, всё получилось.
Сделал вот так:
byte byte1 = results.value >> 6; byte byte2 = results.value >> 4 & 0b0000000000011; byte byte3 = results.value & 0b0000000001111;Спасибо за помощь, всё получилось.
Сделал вот так:
byte byte1 = results.value >> 6; byte byte2 = results.value >> 4 & 0b0000000000011; byte byte3 = results.value & 0b0000000001111;а если за время между byte1 и byte2 к примеру value изменится?
а если за время между byte1 и byte2 к примеру value изменится?
С какого ЛСД ей меняться? Она же не в прерывании значение получает.
а если за время между byte1 и byte2 к примеру value изменится?
С какого ЛСД ей меняться? Она же не в прерывании значение получает.
так откуда жеж я знаю, как там работает библиотека IRREMOTE )))
PS а вдруг?
PPS бережёного...
ЗЫ а три верхних битика тоже нулить не надобно?
// Byte1=1110111, Byte2=00 и Byte3=1111 volatile uint16_t result = 0b1110111001111; volatile byte byte1; volatile byte byte2; volatile byte byte3; void decode_ir(uint16_t data){ uint16_t d = data; byte1 = d >> 6; d = data; byte2 = (d >> 4) & 0b0000000000000011; byte3 = d & 0b0000000000001111; } void setup() { Serial.begin(115200); decode_ir(result); Serial.print("byte1 = "); Serial.println(byte1, BIN); Serial.print("byte2 = "); Serial.println(byte2,BIN); Serial.print("byte3 = "); Serial.println(byte3,BIN); } void loop() { // Здесь может быть Ваш КОТ ))) }ua6em, это кому вопрос? Мне кажется ТС решил проблему, нет?
не знаю, я библиотеку не копал, ЕвгенийП говорит, что прерывание не использует, если использует то нет
PS я всё таки железячник, считаю, что строки 12 и 13 были бы более правильными