Как преобразовать строку в шестнадцатеричный массив
Я пытаюсь использовать дисплей HMI. Если я хочу отправить данные, например, я хочу написать "TOPWAY" на адрес 0x00000080, он должен выглядеть так:
Serial.write(0xaa); // packet head
Serial.write(0x42); // VP_N16 string write command
Serial.write(0x00); // VP_N16 address
Serial.write(0x00);
Serial.write(0x00);
Serial.write(0x80);
Serial.write(0x54); //T
Serial.write(0x4f); //O
Serial.write(0x50); //P
Serial.write(0x57); //W
Serial.write(0x41); //A
Serial.write(0x59); //Y
Serial.write(0x00); //string end with "\0"
Serial.write(0xcc); // packet tail
Serial.write(0x33); // packet tail
Serial.write(0xc3); // packet tail
Serial.write(0x3c); // packet tail
Я хочу создать метод, подобный SendString(String abc), чтобы отправить это, как описано выше. Мне нужно преобразовать строку в шестнадцатеричный массив и вызвать Serial.write(массив[i]). Ты можешь мне помочь?
@mehmet, 👍1
Обсуждение1 ответ
Лучший ответ:
Я ничего не знаю о конкретном дисплее, но, основываясь на предоставленной информации, я надеюсь, что это, по крайней мере, показывает основу того, как вы могли бы подойти к окончательному решению.
Обновление:
- Включены большие улучшения и исправления от Эдгара в комментариях.
- Перегрузка строк.
- Скорость передачи данных в бодах, предложенная Мехметом
#define DISPLAY_DEVICE Serial
#define DISPLAY_DEVICE_BAUD 9600
static uint8_t displayPktStart[] = {
0xaa, // packet headchar
0x42, // VP_N16 string write command
0x00, // VP_N16 address
0x00, // ...Fill
0x00,
0x80
};
static uint8_t displayPktEnd[] = {
0x00, // End of text
0xcc, // packet tail
0x33, // packet tail
0xc3, // packet tail
0x3c // packet tail
};
void writeDisplay(const char* text)
{
// Write packet headers
DISPLAY_DEVICE.write(displayPktStart, sizeof displayPktStart);
// Send text
DISPLAY_DEVICE.print(text);
// Write packet tail
DISPLAY_DEVICE.write(displayPktEnd, sizeof displayPktEnd);
}
void writeDisplay(const String& text)
{
writeDisplay(text.c_str());
}
void setup()
{
DISPLAY_DEVICE.begin(DISPLAY_DEVICE_BAUD);
}
void loop()
{
String msg = "TOPWAY";
writeDisplay(msg);
delay(2000);
writeDisplay("Peanuts taste like chicken");
delay(500);
writeDisplay("");
delay(1000);
writeDisplay("No. Seriously");
delay(2000);
}
1. Вместо записи цикла вы можете DISPLAY_DEVICE.write(displayPktStart, размер displayPktStart);", а также для " displayPktEnd
. 2. Вы имеете в виду " DISPLAY_DEVICE.print(текст);", а не " println ()". 3. "Serial.print ()" не отправит завершающий "\0", вы можете добавить это в "displayPktEnd"., @Edgar Bonet
@EdgarBonet Спасибо. Обновленный., @voidPointer
большое спасибо. Я добавил DISPLAY_DEVICE.begin(9600); в настройках, @mehmet
@mehmet Я надеюсь, что мое обновление соответствует вашим ожиданиям., @voidPointer
@voidPointer ну, я не хочу вас слишком беспокоить, но у меня есть еще один вопрос. если я хочу использовать динамический адрес, например "000080" вместо последовательного, напишите(0x00); Последовательная запись(0x00); Serial.write(0x80); как добавить этот метод, например writeDisplay(msg, "000080");, @mehmet
@mehmet Удалите адрес из displayPktStart, добавьте параметр uint32_t в оба writeDisplay и отправьте его сразу после DISPLAY_DEVICE.write(displayPktStart,..., @voidPointer
- Очень простая операция Arduino Uno Serial.readString()
- Хранение значений широты и долготы в виде символов с заданной точностью
- Из string в int, проблема
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Использование индекса для поиска нескольких символов
- Ардуино - Извлечение нескольких строк из последовательного чтения
- Отправлять строки через SPI в обе стороны, используя два Arduino UNO (ведущий к ведомому и ведомый к ведущему)
- Как преобразовать строку шестнадцатеричных чисел с разделителями в массив int
Не существует такой вещи, как шестнадцатеричный массив. Все - это просто цифры. Даже буквы - это цифры. Ваша строка уже является массивом., @Majenko
Serial.print("TOPWAY");
должен это сделать, @Juraj@Juraj вы имеете в виду именно это для общего запроса, как указано выше: Серийный.пишите(0xaa); Серийный.запись(0x42); Последовательная запись(0x00); Последовательная запись(0x00); Последовательная запись(0x00); Последовательная запись(0x80); Последовательная печать("СВЕРХУ"); Последовательная запись(0x00); //строка заканчивается на "\0" Последовательный.запись(0xcc); Серийный.запись(0x33); Последовательный.запись(0xc3); Последовательный.запись(0x3c); . если нет? пожалуйста, покажите мне ответ, а не в комментарии., @mehmet
ответ приведен ниже, @Juraj