Перевод int в HEX для irsend

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

Добрый день!

Помогите решить задачу, над которой бьюсь несколько дней.

Задача: 

В переменной на ардуино хранится ИК команда, например, FDC23. Её нужно отправить ИК-светодиоду через irsend.sendNEC()

 

int ir=FDC23;

irsend.sendNEC(0xFDC23, 32) - Работает(ИК приемник правильно интерпретирует команду)

irsend.sendNEC(ir, 32) - Не работает

irsend.sendNEC(FDC23, 32) - Не работает

 
Как приделать префикс 0x к переменной ir, чтобы получилось 0xFDC23?
 
Пробовал сохранять как строку "0xFDC23" и переводить в int с помощью strtoul(), toInt(). Переводится не корректно.
nikolaevartem
Offline
Зарегистрирован: 05.11.2015

Я не очень точно написал.

строка int ir=FDC23; - для наглядности, конечно, вместо HEX тут стоит команда в DEC.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

int ir = 0xFDC23;

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

Согласен.

Дело в том, что переменные попадают в ардуино через фотодиод.

После прочтения им команды, я получаю переменную 

ir= FDC23;

Как ее сохранить в формате 0xFDC23 ?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

long int strtol (const char* str, char** endptr, int base);

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nikolaevartem, вы получаете эту переменную как? там вроде просто Serial.print  Уберите оттуда ",HEX" и будет писать в десятичке

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

dimax пишет:

nikolaevartem, вы получаете эту переменную как? там вроде просто Serial.print  Уберите оттуда ",HEX" и будет писать в десятичке

Как я уже писал, получаю переменную при декодирования ИК сигнала. Стандартным примером из библиотеки Irremote.

Дело не в том, в каком виде переменная выводится на экран.

Функция irremote.sendNEC() позволяет отправлять команды в HEX, но к ним еще нужен префикс "0x".

 

DIYMan пишет:

long int strtol (const char* str, char** endptr, int base);

Спасибо, буду пробовать.

 
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Без попкорна не обойтись, ждем'с развязки

nikolaevartem
Offline
Зарегистрирован: 05.11.2015
Если взять такой код и сравнить результат от двух разных строк:
 
 char str[]="0xFDC23";
 char str1[]="FDC23";
 
  long int n=strtol(str,NULL,16);
  Serial.print("HEX: ");
  Serial.println(n,HEX);
 
  n=strtol(str1,NULL,16);
  Serial.print("HEX: ");
  Serial.println(n,HEX);
 
то результат будет таким:
 
HEX: FDC23
HEX: FDC23
 
На днях подключу светодиод, попробую первый и второй вариант исходной строки("0xFDC23" и "FDC23").

Ожидаемый префикс "0x" на выходе так и не появился( надо пробовать на sendNEC...

 

Возможно, стоит зайти с другой стороны и заставить irremote.sendNEC() отправлять код в DEC или CHAR[]?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nikolaevartem пишет:

Возможно, стоит зайти с другой стороны и заставить irremote.sendNEC() отправлять код в DEC или CHAR[]?

По моему вы не поняли о чём я сказал в #5  Ваш код изначально лежит в переменной лонг.  В хексе он вам просто выводится на экран. Т.к. это просто тип отображения .  Если вы не хотите что бы показывал в хексе -уберите из вывода  ",HEX" 

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

dimax пишет:

По моему вы не поняли о чём я сказал в #5  Ваш код изначально лежит в переменной лонг.  В хексе он вам просто выводится на экран. Т.к. это просто тип отображения .  Если вы не хотите что бы показывал в хексе -уберите из вывода  ",HEX" 

Я Вас понял, но задача состоит в другом. Я ее подробно описал выше.

Главное, чтобы функция irremote.sendNEC(), считала, что к ней приходят команды вида "0xFDC23", а не "FDC23".

Она не работает, если отсылать

FDC23

"FDC23"

"0xFDC23"

а так же в DEC и BIN

А работает только если явно написать

irremote.sendNEC(0xFDC23, 32);

JasKo
Offline
Зарегистрирован: 21.11.2015

В библиотеке написано следующее void  IRsend::sendNEC (unsigned long data,  int nbits)

Значит переменная в ктоторой вы храните код должна быть unsigned long , но не как не int. (см. размерность типов)

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

JasKo пишет:

В библиотеке написано следующее void  IRsend::sendNEC (unsigned long data,  int nbits)

Значит переменная в ктоторой вы храните код должна быть unsigned long , но не как не int. (см. размерность типов)

Другими словами

unsigned long ir=0xFDC23;

irsend.sendNEC(ir, 32);

Должно работать. 

JasKo
Offline
Зарегистрирован: 21.11.2015

Не ужели еще не проверили? Конечно будет. Ваша прблема в том, вместо 32 бит вы передавали переменную 16 бит, нехватяюшие 16 бит брались программой send из соседних ячеек, вот и получалась ерунда. Следите за размерностью типов. Заглядывайте в исходники библиотек.

 

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

.

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

JasKo пишет:

Не ужели еще не проверили? Конечно будет. Ваша прблема в том, вместо 32 бит вы передавали переменную 16 бит, нехватяюшие 16 бит брались программой send из соседних ячеек, вот и получалась ерунда. Следите за размерностью типов. Заглядывайте в исходники библиотек.

Мне приятно Ваше любопытство) Приеду из командировки, буду пробовать.

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

JasKo пишет:

Не ужели еще не проверили? Конечно будет. Ваша прблема в том, вместо 32 бит вы передавали переменную 16 бит, нехватяюшие 16 бит брались программой send из соседних ячеек, вот и получалась ерунда. Следите за размерностью типов. Заглядывайте в исходники библиотек.

Мне приятно Ваше любопытство) Приеду из командировки, буду пробовать.

nikolaevartem
Offline
Зарегистрирован: 05.11.2015

Все получилось.

Если указывать тип unsigned long, то irsend отлично отсылает записанную переменную.