Программа прокрутки текста 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

Обсуждение

вы не освобождаете память, занятую malloc(). не используйте malloc() в Uno. даже если вы освободите память, небольшая куча быстро фрагментируется. вы можете сделать то же самое с буфером в стеке, @Juraj


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);
}
,