Проблемы с преобразованием 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[]
?
@Augusto, 👍3
2 ответа
byte и char — это одно и то же. Если вы установите 0 в качестве конца строки после последнего символа в буфере, вы получите строку, заканчивающуюся нулем. Если вам действительно необходимо использовать String, вы можете создать экземпляр с конструктором, который принимает строку с нулевым завершением.
buffer[tam] = 0;
String str((char*) buffer);
Выделите в буфере место для нуля. Приведение (char*)
говорит о том, что массив байтов является массивом символов.
Примечание. Не используйте класс String в MCU, используйте массивы символов, заканчивающиеся нулем.
Если вы измените 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 /.
- Разобрать mac-строку char* в массив uint8_t
- Еще один простой и глупый вопрос о строках C++
- форматирование строк в Arduino для вывода
- Как преобразовать строку в массив байтов
- Преобразование строки в IP-адрес
- Чтение строки, разделенной запятыми
- Недопустимое преобразование из 'char' в 'const char*' [-fpermissive] в строке
- Использование строки вместо строки C, еще одна попытка затронуть загруженную проблему
Мне просто нужно значение, но String легко отправить по Bluetooth. Я тоже могу отправить
char
, но не знаю, как преобразовать., @Augustoустановить 0 в качестве конца строки после последнего символа в буфере. но дайте место для этого. если номера RFID состоят из 18 символов, то выделите 19, @Juraj
я расширил ответ, @Juraj
@Августо, помогло?, @Juraj