Строка в 16-разрядное целое число без знака

В настоящее время я работаю над проектом с дисплеем 4DSystems. Я разговариваю с дисплеем через SoftwareSerial с помощью ESP32. Как только я захочу использовать символ Юникода, мне потребуется преобразовать всю мою строку в uint16_t. Кто-нибудь может мне помочь, я понятия не имею, как мне быть дальше с этим?

  #include <genieArduino.h>
  void loop() {
    uint16_t tn[] = { 0x2126,0 }; // Ω
    genie.WriteStrU(0, tn);
  }

Это работает, но как я мог бы вставить переменную в uint16_t?

, 👍0

Обсуждение

Пожалуйста, укажите код, который у вас есть, сообщения об ошибках, которые вы получили, и ссылки на используемые части и библиотеки., @chrisl

Для какого Arduino это нужно?, @Nick Gammon

Я раньше не видел эту библиотеку отображения, но, вероятно, было бы проще записывать только фактические символы Юникода с помощью функции Юникода, а остальные - с помощью обычных функций записи. Или есть какая-то конкретная причина, по которой вы хотите поместить другую (возможно, числовую) переменную внутри этой строки Unicode? Из документации библиотеки неясно, какая кодировка на самом деле там используется. Возможно, было бы также просто записать обычные данные ASCII в вашу строку unicode, просто приведенную к uint16_t (оставив старший байт пустым)., @chrisl


1 ответ


1

Как упоминал крисл в комментарии, ваш лучший вариант - использовать обычный метод WriteStr() для печати переменных и использовать WriteStrU() для печати строковых констант Юникода. Например:

float R = 12.34;  // фиктивное значение сопротивления.
genie.WriteStr(0, "R = ");
genie.WriteStr(0, R);
genie.WriteStrU(0, (uint16_t *) u" Ω");

следует напечатать:

R = 12.34 Ω

Обратите внимание на использование префикса строки u для записи строк в кодировке UTF-16 в исходном коде.


Обновление: Вы написали

WriteStr всегда заменяет текст внутри строкового объекта вместо добавления.

Это все усложняет. Единственный вариант, который я вижу, - это предварительно отформатировать все сообщение как UTF-16, а затем отправить его с помощью WriteStrU(). Вот класс, который выполняет простое форматирование UTF-16. Он наследуется от класса Print , что означает, что вы можете print() для него все, что вы могли бы распечатать в Serial. Кроме того, он может печатать строки в формате UTF-16:

template <size_t max_length>
class UTF16Writer : public Print {
public:
    // Преобразовать ASCII в UTF-16.
    size_t write(uint8_t c) {
        if (length >= max_length)
            return 0;  // буфер заполнен
        buffer[length++] = c;
        buffer[length] = 0;  // завершающая строка
        return 1;
    }
    // Запишите данные в формате UTF-16.
    size_t print(const char16_t *s) {
        size_t chars_written = 0;
        while (*s && length < max_length) {
            buffer[length++] = *s++;
            chars_written++;
        }
        buffer[length] = 0;  // завершающая строка
        return chars_written;
    }
    using Print::print;
    uint16_t buffer[max_length + 1];
private:
    size_t length = 0;
};

Параметр шаблона - это емкость буфера. После того как вы записали все сообщение в формате UTF-16, используя этот класс, вы можете передать его элемент буфера для WriteStrU(). Например:

float R = 12.34;  // фиктивное значение сопротивления.
UTF16Writer<16> writer;
writer.print("R = ");
writer.print(R);
writer.print(u" Ω");
genie.WriteStrU(0, writer.buffer);

Примечание: Не забудьте префикс u в строке Unicode, иначе байты строки (UTF-8 в исходном коде) будут интерпретироваться как latin1 с помощью UTF16Writer::print(const char*). Сообщение типа "martine écrit en UTF-8" затем будет отображаться как “martine écrit en UTF-8”.

,