Проблемы с преобразованием byte[] в String

Я считываю RFID-карту с RC522 и отправляю данные на свой компьютер. Моя проблема заключается в преобразовании byte[] в String или std::string.

#define SIZE_BUFFER     18
#define MAX_SIZE_BLOCK  16

byte buffer[SIZE_BUFFER] = {0};
byte tam = SIZE_BUFFER;

// получить данные
status = mfrc522.MIFARE_Read(bloco, buffer, &tam);

  Serial.print(F("\nDados bloco ["));
  Serial.print(F("]: "));

// печать...
 for (uint8_t i = 0; i < MAX_SIZE_BLOCK; i++)
  {
      Serial.write(buffer[i]);
      str += String(buffer[i]);
  }

ВЫВОД:

Dados bloco []: asdas

Так что все в порядке! Но если я попытаюсь создать строку:

  String str = "";

  for (uint8_t i = 0; i < MAX_SIZE_BLOCK; i++)
  {
      str += String(buffer[i]);
  }
  Serial.println(" ");
  Serial.println(str);

Вывод:

97115100971153232323232323232323232

Как правильно создать String из byte[]?

, 👍3


2 ответа


3

byte и char — это одно и то же. Если вы установите 0 в качестве конца строки после последнего символа в буфере, вы получите строку, заканчивающуюся нулем. Если вам действительно необходимо использовать String, вы можете создать экземпляр с конструктором, который принимает строку с нулевым завершением.

buffer[tam] = 0;
String str((char*) buffer);

Выделите в буфере место для нуля. Приведение (char*) говорит о том, что массив байтов является массивом символов.

Примечание. Не используйте класс String в MCU, используйте массивы символов, заканчивающиеся нулем.

,

Мне просто нужно значение, но String легко отправить по Bluetooth. Я тоже могу отправить char, но не знаю, как преобразовать., @Augusto

установить 0 в качестве конца строки после последнего символа в буфере. но дайте место для этого. если номера RFID состоят из 18 символов, то выделите 19, @Juraj

я расширил ответ, @Juraj

@Августо, помогло?, @Juraj


3

Если вы измените str += String(buffer[i]); на str += (char)buffer[i];, будут напечатаны символы ascii к последовательному монитору.

Следующий скетч можно использовать, чтобы увидеть разницу в размере двоичного файла, скомпилированного с использованием этих двух методов «добавления в строку».

// от 4026 до 3758 байт.
#define SIZE_BUFFER     18
#define MAX_SIZE_BLOCK  16

byte buffer[SIZE_BUFFER] = {
  0x61, 0x73, 0x64, 0x61,
  0x73, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20
};

String str = "";

void setup(){

  Serial.begin(9600);

  for (uint8_t i = 0; i < MAX_SIZE_BLOCK; i++)
  {
      // 4026 байт. Выводит: "97115100971153232323232323232323232"
      //str += String(buffer[i]);

      // 3758 байт. Принты: "асдас"
      str += (char)buffer[i];
  }
  Serial.println(" ");
  Serial.println(str);
}

void loop(){}

Приведение каждого элемента в байтовом буфере к Char с последующим добавлением его в строку уменьшает размер скомпилированного бинарного файла с 4026 до 3758 байт. Это хорошо, но мы действительно можем улучшить скетч, не вообще не используя объект String.

Этот скетч такой же, как и первый, за исключением того, что в нем используется массив символов вместо строки.

// 2074 байта.
#define SIZE_BUFFER     18
#define MAX_SIZE_BLOCK  16

byte buffer[SIZE_BUFFER] = {
  0x61, 0x73, 0x64, 0x61,
  0x73, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20,
  0x20, 0x20, 0x20, 0x20
};

// Используйте массив символов вместо объекта String.
char outputBuffer[SIZE_BUFFER];

void setup(){

  Serial.begin(9600);

  for (uint8_t i = 0; i < MAX_SIZE_BLOCK; i++)
  {
      // 2074 байта. Принты: "асдас"
      outputBuffer[i] = (char)buffer[i];
  }
  Serial.println(" ");
  Serial.println(outputBuffer);
}

void loop(){}

Размер скомпилированного бинарного файла составляет 2074 байта. Это на 1684 байта меньше, чем при использовании объекта String.

Существует множество функций для работы с массивами символов на Arduino, например http:/ /www.cplusplus.com/reference/cstring/ и http://www.cplusplus.com/reference/cstdlib /.

,