Пребразование массива в строку

AlexAsino
Offline
Зарегистрирован: 23.10.2014

Добрый день!

Заморочился одной проблемой, делаю  2  выносных пульта для снятия / постановки на охрану.  Необходимо  считать  ключ iButton и отправить данные по  протоколу MQTT.

 

void iButton(){
  byte addr[8]; //ibutton
 if (ds.search(addr)){
    for(int i = 0; i < 8; i++){
     Serial.print(addr[i], HEX);
    }
    Serial.println();
>>>
  client.publish("/iButton", String(myStrArray).c_str(), true); 
    ds.reset_search();
   }
  }

В serial  код ключа выводиться, но конвертировать данные  в  пребразовать для отправки не получается. Сохранить и сравнить с другим массивом могу, а тут что то  тупик.

 

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

Не знаю, что Вы делаете, т.к. код без начала и без конца и нет описаний ключевых переменных. Замечу только, что если myStrArray - это массив char, то Ваша запись String(myStrArray).c_str() - еслть просто несколько извращённая ворма написать просто myStrArray. Ровно тоже самое, только "через Альпы".

AlexAsino
Offline
Зарегистрирован: 23.10.2014

ЕвгенийП, спасибо, что откликнулись!

 

Тут дело  даже не во  всем скетче, а в граблях которые я себе подложил. Опыта у меня мало, раньше не приходилось конвертировать массив.  Не могу понять возможно ли из байтового массива  в значении HEX (например: F0 F1 F2 F3 F4 F5 F6) получить  строку  с этими же  значениями. Начинаю  подозревать, что это  невозможно  из-за конвертирования переменных. Уже прихожу к мысли создать из массива по некой формуле число и передвать уже его. Мой колхоз перевода :

 

byte addr[8] = {0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7};
void setup() {
  Serial.begin(57600);
}

void loop() {
Serial.print("byte "); 
for(int i=0; i<7; i++){// Запускаем цикл печати данных из массива
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" "); 
   }
Serial.println();// В конце цикла переводим строку

// преобразуем массив byte в строку
String myStrings = String((char*)addr);
Serial.print("String ");
Serial.print(myStrings);// Печатаем строку 
  Serial.println();// В конце цикла переводим строку
  delay(1000);
}

В  serial  получаю:

byte F0 F1 F2 F3 F4 F5 F6 
String рстуфхцч

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AlexAsino, зачем Вам вообще строка?

Выводите массив байтов в цикле через Serial.write().

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

AlexAsino пишет:

 Не могу понять возможно ли из байтового массива  в значении HEX (например: F0 F1 F2 F3 F4 F5 F6) 

Уверен, что Вам это нахрен не нужно. Там в массиве всё сидит как надо, просто передавайте байт за байтом и не парьтесь. Красивости типа F0 - только для человеческого восприятия, внутри в памяти все едино хоть F0, хоть 240, хоть 0360 - это всё ровно одно и тоже, и чем скорее Вы это поймёте, тем раньше сбросите с ушей огромный пласт лапши, который Вы сами туда нагрузили.

AlexAsino
Offline
Зарегистрирован: 23.10.2014

Да, Вы правы! Хотелось  сделать  красиво, а нужно  лишь передать по mqtt значение ключа .  А в каком значении  будет передано не особо  важно, лишь бы для каждого ключа значение было индивидуальным. Что и так уже получено.

Всем спасибо!