Проблема отображения MD_Parola при построении теста
Я использую ESP8266 и плитки с 4-точечной матрицей для отображения часов (обновления с использованием NTP и WiFi).
Все работает хорошо, но только когда я создаю текст, используя тип const char*
.
Но поскольку я хочу создать текст как sprintf(temp, "12:00");
или char temp[20]="12:00\n;< /code> создает бессмысленный текст.
MD_Parola dotMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
void updateTime()
{
char clk[10];
char dat[10];
char temp[10];
sprintf(temp, "12:00"); // <---- этот способ не работает
const char *t = "12:00"; // <---- этот путь удался
dotMatrix.displayText(t, PA_CENTER, 0, 0, PA_PRINT, PA_NO_EFFECT);
}
ссылка на библиотеку
Пожалуйста, объясните, как построить текст не как const char*
@Guy . D, 👍0
Обсуждение1 ответ
Лучший ответ:
В документации библиотеки указано:
Библиотека не выделяет память для текстового сообщения
Это говорит о том, что буфер должен быть действителен после выполнения функции displayText()
. Но поскольку вы объявляете это внутри своей функции updateTime()
, буфер выходит за пределы области действия при выходе из этой функции. Затем пространство памяти может быть повторно использовано остальной частью программы. В этот момент библиотека по-прежнему будет иметь указатель на старое местоположение, хотя теперь этот указатель можно считать недействительным. Таким образом, вы просто читаете, что компилятор решил разместить в этом месте памяти.
Чтобы решить эту проблему, вам нужно оставить переменную буфера в области видимости. Это можно сделать, переместив объявление в глобальную область.
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отобразить символ º на ЖК-дисплее?
- Путаница между SPI и I2C для SSD1306 OLED
- Потенциометр 10 кОм против резистора 10 кОм на ЖК-дисплее
- Не могу заставить 4 значный 7 сегментный дисплей показывать разные значения
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Запуск 7-контактного OLED-дисплея с 4 контактами (I2C)
- Как отобразить переменные с плавающей запятой на OLED-дисплее (0,96 дюйма)
Вы не написали, как вы передаете
temp
функцииdotMatrix.displayText()
. Вы просто пишете «temp» там, где сейчас пишется «t»? Вы пытались предоставить указатель наtemp
? Я не уверен в неявной обработке массивов как указателей, но вы можете попробовать что-то вроде&temp
или&temp[0]
, чтобы получить указатель как параметр функции отображения. Вот что я бы попробовал в этом случае, @chrisl@chrisl -
t
заменяетtemp
, как вы просили.&temp
не компилируется, а&temp[0]
дает тот же результат, что иtemp
, @Guy . DМмм, в документации библиотеки указано, что библиотека не использует внутренний буфер, а указывает на буфер, на который вы указываете указатель. Я не смотрел в библиотеку ближе, но проблема может заключаться в том, что буфер
temp
выходит за пределы области видимости после выхода из функции, а это означает, что библиотека использует указатель на недопустимое место. Пожалуйста, попробуйте переместить объявление временного буфера в глобальную область., @chrisl@chrisl - я также прочитал то, что вы сказали, но я не понял, что это должно быть внешним. верно! пожалуйста, опубликуйте как ответ, @Guy . D