Строка в массив динамических байтов
Я новичок в Arduino, застрял в String в динамическом массиве байтов.
Моя строка:
String Finalval="6D616320747820636E662031352033300D0A";
Динамический массив байтов:
byte ft[]={0x6D,0x61,0x63,0x20,0x74,0x78,0x20,0x63,0x6E,0x66,0x20,0x31,0x35,0x20,0x33,0x30,0x0D,0x0A};
@Vikash Singh, 👍1
1 ответ
Лучший ответ:
▲ 0
Общие функции преобразования C-строки в массив байтов, как показано в https:// stackoverflow.com/questions/3408706/hexadecimal-string-to-byte-array-in-c работают отлично.
Source hex string: 6D616320747820636E662031352033300D0A
Conversion OK buff 0x289 len 18
output byte array:
00 6d 61 63 20 74 78 20 63 6e 66 20 31 35 20 33 30 mac tx cnf 15 30
10 0d 0a ..
#include <Arduino.h>
void hexDump (const char *desc, const void *addr, const int len);
bool convert_hexstr_to_bytearray(const char* source, uint8_t* &output,
size_t& output_len) {
size_t len = strlen(source);
// не может преобразовать нечетную длину строки
if ((len % 2) != 0) {
return false;
}
//динамически выделяем выходной буфер
output_len = len / 2;
output = (uint8_t*) malloc(output_len);
const char* curPos = source;
for (size_t count = 0; count < len; count++) {
sscanf(curPos, "%2hhx", output + count);
curPos += 2;
}
return true;
}
String Finalval="6D616320747820636E662031352033300D0A";
void setup() {
Serial.begin(115200);
Serial.print("Source hex string: ");
Serial.println(Finalval);
Serial.flush();
uint8_t* buffer = nullptr;
size_t buffer_len = 0;
if(convert_hexstr_to_bytearray(Finalval.c_str(), buffer, buffer_len)) {
Serial.println("Conversion OK buff 0x" + String((long)buffer,HEX) + " len " + String(buffer_len));
hexDump("output byte array", buffer, buffer_len);
} else {
Serial.println("Conversion failed\n");
}
//свободная память
if(buffer)
free(buffer);
}
void loop() {
}
void PrintHex8(const uint8_t *data, uint8_t length) // печатает 8-битные данные в шестнадцатеричном формате
{
char tmp[length*2+1];
byte first;
byte second;
for (int i=0; i<length; i++) {
first = (data[i] >> 4) & 0x0f;
second = data[i] & 0x0f;
// база для преобразования однозначных чисел в ASCII равна 48
// база для 10-16, чтобы стать символами нижнего регистра af равна 87
// примечание: разница 39
tmp[i*2] = first+48;
tmp[i*2+1] = second+48;
if (first > 9) tmp[i*2] += 39;
if (second > 9) tmp[i*2+1] += 39;
}
tmp[length*2] = 0;
Serial.print(tmp);
}
void hexDump (const char *desc, const void *addr, const int len) {
int i;
unsigned char buff[17];
const unsigned char *pc = (const unsigned char*)addr;
// Описание вывода, если оно задано.
if (desc != NULL) {
Serial.print (desc);
Serial.println(":");
}
if (len == 0) {
Serial.print(" ZERO LENGTH\n");
return;
}
if (len < 0) {
Serial.println(" NEGATIVE LENGTH: " + String(len));
return;
}
// Обрабатываем каждый байт данных.
for (i = 0; i < len; i++) {
// Число, кратное 16, означает новую строку (со смещением строки).
if ((i % 16) == 0) {
// Просто не печатайте ASCII для нулевой строки.
if (i != 0) {
Serial.print (" ");
Serial.println((char*)buff);
}
// Вывод смещения.
Serial.print (" ");
PrintHex8((uint8_t*)&i, 1);
}
// Теперь шестнадцатеричный код для конкретного символа.
Serial.print(" ");
PrintHex8(pc + i,1);
// И сохранить печатный символ ASCII на потом.
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
buff[i % 16] = '.';
else
buff[i % 16] = pc[i];
buff[(i % 16) + 1] = '\0';
}
// Дополнить последнюю строку, если не ровно 16 символов.
while ((i % 16) != 0) {
Serial.print (" ");
i++;
}
// И вывести последний бит ASCII.
Serial.print (" ");
Serial.println((char*)buff);
}
,
@Maximilian Gerhardt
Смотрите также:
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Разница между массивом char и массивом unsigned char
- Arduino UNO + Ethernet Shield + ЖК-дисплей + RFID, но RFID не работает
- Firmata: как установить определенный PIN на высокий уровень при загрузке?
- Arduino wrap или подкласс print() для работы с несколькими Serial
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Проблемы с Serial.read()
- Как отправить данные ads1115 через spi на master arduino
Я пытаюсь это сделать, но не работаю Serial.write(buffer,sizeof(buffer)), @Vikash Singh
@VikashSingh, нигде в опубликованном коде нет утверждения:
Serial.write(buffer,sizeof(buffer))
., @user3629249@VikashSingh звучит так, будто у вас серьезная проблема при обработке декодированного буфера. Какой точный код?, @Maximilian Gerhardt
@MaximilianGerhardt спасибо за помощь, моя проблема решена, @Vikash Singh