Программа прокрутки текста Arduino зависает через некоторое время
Я использую ЖК-дисплей размером 16x2 символа для отображения текста. Я хочу, чтобы первая строка осталась, а вторая строка должна прокручивать текст.
Я написал программу, которая отлично работает, но проблема в том, что через некоторое время arduino не отвечает. Я подозреваю, что в коде может быть ошибка или утечка памяти.
Соответствующий код выглядит следующим образом.
void scrollTextFromRight(int line, char text[])
{
const char space[16] = " ";
char screen[16];
char * longText;
longText = malloc(sizeof(char) * (sizeof(text) + 17));
memset(longText, '\0', sizeof(char) * (sizeof(text) + 17));
memset(screen, '\0', sizeof(screen));
for (int i = 0; i < 16; ++i)
{
longText[i] = space[i];
}
for (int j = 0; j < sizeof(text) + 17; ++j)
{
longText[16+j] = text[j];
}
for (int i = 0; i < sizeof(text) + 17; ++i)
{
lcd.setCursor(0, line);
strncpy(screen, longText + i, 17 );
lcd.print(screen);
delay(350);
}
}
Я вызываю эту функцию из основной программы следующим образом:
scrollTextFromRight(1, "Scrolling text");
@, 👍0
Обсуждение1 ответ
Лучший ответ:
▲ 1
Вы malloc, но не освобождаете. Конечно протечет. Также sizeof(text)
так не работает. Вместо этого вы можете выполнить команду strlen, чтобы получить количество символов в массиве символов, завершающемся нулем.
Вы можете сделать это без буфера longText
, выполнив частичное копирование в экран
.
const char space[16] = " ";
char screen[16];
for (int i = 0; i < sizeof(text) + 17; ++i)
{
lcd.setCursor(0, line);
strncpy(screen, space, i); // копируем i пробелов
strncpy(screen+i, text, min(17-i, strlen(text))); // копируем оставшуюся часть строки до конца, в зависимости от того, что короче.
screen[17] = '\0'; // принудительное нулевое завершение
lcd.print(screen);
delay(350);
}
,
@ratchet freak
Смотрите также:
- Печать string and integer LCD
- Отправка значения с одного Arduino на другой
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Запрограммируйте Arduino Uno как цифровые часы
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Почему эта программа на C++ не может прочитать Serial.write() моего arduino?
- ЖК-дисплей странные символы
вы не освобождаете память, занятую malloc(). не используйте malloc() в Uno. даже если вы освободите память, небольшая куча быстро фрагментируется. вы можете сделать то же самое с буфером в стеке, @Juraj