Разделить полученный сигнал на отдельные пакеты

JakeW.
Offline
Зарегистрирован: 04.03.2022

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

Через ИК-датчик на ардуино я отправляю команду с некого пульта.

На ардуино приходит команда в 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(); // принимаем следующий сигнал на ИК приемнике
    }
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

битовыми операциями, типа

byte byte1 = results >> 6;

 

JakeW.
Offline
Зарегистрирован: 04.03.2022

Можете пожалуйста поподробнее показать, как это будет выглядеть для всех 3х пакетов?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
byte3 = result &0x0000000000001111
byte2 = (result >>4)&0x0000000000000011
byte1=(result>>2)

Может так? но не уверен

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

а поучиться/почитать не желаете?

Битовые операции в си (&, |, ^, ~, <<, >>) (learnc.info)

byte1 у вас сдвиг вправо на 6
byte2 сдвиг вправо и логическая И для обнуления старших битов
byte3 соответственно логическая И для обнуления старших битов
 

JakeW.
Offline
Зарегистрирован: 04.03.2022

Спасибо за помощь, всё получилось.

Сделал вот так:

      byte byte1 = results.value >> 6;
      byte byte2 = results.value >> 4 & 0b0000000000011;
      byte byte3 = results.value & 0b0000000001111;

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

JakeW. пишет:

Спасибо за помощь, всё получилось.

Сделал вот так:

      byte byte1 = results.value >> 6;
      byte byte2 = results.value >> 4 & 0b0000000000011;
      byte byte3 = results.value & 0b0000000001111;

а если за время между byte1 и byte2 к примеру value изменится?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

а если за время между byte1 и byte2 к примеру value изменится?

С какого ЛСД ей меняться? Она же не в прерывании значение получает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

а если за время между 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() {
// Здесь может быть Ваш КОТ )))
}

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

ua6em, это кому вопрос? Мне кажется ТС решил проблему, нет?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andycat пишет:
ua6em, это кому вопрос? Мне кажется ТС решил проблему, нет?

не знаю, я библиотеку не копал, ЕвгенийП говорит, что прерывание не использует, если использует то нет

PS я всё таки железячник, считаю, что строки 12 и 13 были бы более правильными