Arduino滚动文本程序在一段时间后冻结

时间:2019-01-23 13:22:01

标签: c++ arduino lcd

我使用16x2字符LCD来显示一些文本。我要的是第一行是固定的,第二行是滚动。

我编写了一个运行正常的程序,但问题是一段时间后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");

更新1:
阅读注释和答案后,我使用free函数释放了分配的内存空间。我上传了新代码并测试它是否按预期工作。

我在第三个for循环之后添加了这部分。

free longText;

更新2:
阅读注释后,我决定使用Arduino的String类。代码变成这样:

void scrollTextFromRight(int line, String text)
{
    const String space = "                ";
    const String longText = space + text + ' ';
    int displaySize = 16;

    for (int i = 0; i <= longText.length(); ++i)
    {
        lcd.setCursor(0, line);
        String display = longText.substring(i, i + displaySize);
        lcd.print(display);
        delay(350);
    }
}

1 个答案:

答案 0 :(得分:3)

当您将参数声明为char text[]时,编译器会将其转换为char* text。也就是说,它是一个指针。

获取指针的大小(例如sizeof(text))可以得到 pointer 的大小,而不是指针指向的大小。如果它是一个以空值终止的字节字符串,请使用strlen来获取长度(但请注意,不计入空值终止符)。

甚至更好的是,停止使用C字符串和函数,因为Arduino实际上是用C ++编程的,并且具有适用于所有字符串的自己的标准String类。


还请注意

const char space[16] = "                ";

创建一个由16个元素组成的数组,并将所有这些元素设置为空格字符' ' 但是 它不是一个以空字符结尾的字符串,因为终止符不适合数组。

您还了解memset函数,但是似乎从数组中复制时忘记了memcpy函数。

您可以简单地执行以下操作,而不是从space进行显式循环复制

memcpy(longText, space, sizeof space);  // Using sizeof since space is not null-terminated

最后,请注意strncpy函数,它可能不会以空字符结尾的目标字符串。