Как преобразовать массив байтов в одну переменную

В этом коде я беру данные TID (20 байт по 160 бит) в виде массива в соответствии с документацией, и они работают правильно и получают выходные данные RFID-тегов.

Теперь мне просто нужно ваше руководство: как мне преобразовать массив из 20 байт в одну переменную или в тип данных двойной длины? или другие. Потому что мне нужно отправить его на сервер базы данных MySQL для дальнейшей обработки.

Я попробовал следующий код, который работает нормально

byte x[10] = "450210921";
long result = atol(x);
Serial.print("long value of the byte is: ");
Serial.println(result);

но когда я помещаю приведенный выше код в свой основной код, не получаю никаких ошибок и не получаю требуемого вывода.!

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  byte response;
  byte myTID[20]; //TID составляют 20 байт
  byte tidLength = sizeof(myTID);

  //Читаем уникальный идентификатор тега
  response = nano.readTID(myTID, tidLength);
  if (response == RESPONSE_SUCCESS)
  {
    for(byte x = 0 ; x < tidLength ; x++)
    {
      if(myTID[x] < 0x10) Serial.print("0");
      /*temp[x]=(myTID[x], HEX);*/
      //Заменяем значения во временную переменную
      temp[x]=myTID[x];  
      Serial.print(temp[x]);
    }
    /*byte x[10] = "450210921";*/
    //Преобразуем весь массив в одну длинную переменную
    long result = atol(temp);
    Serial.print("long value of the byte is: ");
    Serial.println(result);
  }
  else
    Serial.println("Failed read");
}

, 👍1

Обсуждение

Не существует такой вещи, как одна переменная размером 160 бит. Я *думаю*, что вы хотите отформатировать байты как строку (и здесь есть много вопросов по этому поводу)., @Majenko

Хорошо @Majko, но есть ли способ перенести весь массив в MySQL в одну ячейку таблицы с помощью nodemcu?, @Eza

Я понятия не имею, что такое MySQL, но вы можете взять каждый байт массива, превратить его в текстовое представление шестнадцатеричной пары, объединить их все в строку и использовать эту строку., @Majenko

https://arduinoprosto.ru/q/53258/how-to-store-an-rfid-tag-number-in-a-string, @Majenko

Есть несколько простых ошибок: 1) "atol(x)" должно быть "atol(tmp)", 2) но тогда "tmp" должно заканчиваться нулем, 3) что означает, что он слишком короткий. И так далее., @Mikael Patel


1 ответ


Лучший ответ:

0

Вы не можете преобразовать 20 байт в длинные. Отправьте его как строку шестнадцатеричных значений. Байт занимает два шестнадцатеричных символа, поэтому вы отправите строку из 40 символов, которую можно просто декодировать обратно в байты.

char str[sizeof(myTID) * 2 + 1];
const char* hex = "0123456789ABCDEF";
for (int i = 0; i < sizeof(myTID); i++) {
  str[i * 2] = hex[(myTID[i] >> 4)];
  str[i * 2 + 1] = hex[(myTID[i] & 0x0F)];
}
str[sizeof(str)] = 0;
Serial.println(str);
,

Оно работает! Спасибо, а что насчет этого for(byte x = 0; x <sizeof(myTID); x++) { content.concat(String(myTID[x] < 0x10 ? " 0" : " ")); content.concat(String(myTID[x], HEX)); } контент.toUpperCase(); softSerial.print(содержимое);, @Eza

Строка не очень хорошая, @Juraj

Не могли бы вы объяснить, что струна плохая!!, @Eza

https://hackingmajokblog.wordpress.com/2016/02/04/the-evils-of-arduino-strings/, @Juraj