代码之家  ›  专栏  ›  技术社区  ›  Erdem

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

  •  0
  • Erdem  · 技术社区  · 7 年前

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

    我写了一个程序,工作得很好,但问题是过了一段时间,阿杜诺没有反应。我怀疑代码中可能有错误或内存泄漏。

    相关代码如下。

    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:
    在阅读了评论和答案之后,我释放了分配的内存空间和空闲功能。我上传了新的代码,并测试它是否按预期工作。

    我在第三个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 回复  |  直到 7 年前
        1
  •  3
  •   Some programmer dude    7 年前

    当你把论点声明为 char text[] 编译器将其翻译为 char* text . 也就是说,它是一个指针。

    获取指针的大小(例如 sizeof(text) )给你的尺寸 指针 不管它指向什么。如果是以空结尾的字节字符串,则使用 strlen 获取长度(但请注意,空终止符不计算在内)。

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


    还要注意

    const char space[16] = "                ";
    

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

    你也知道 memset 功能,但似乎忘记了 memcpy 从数组中复制时的函数。

    而不是从 space 你可以简单地

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

    最后,小心 strncpy 函数,它可能不为空,终止目标字符串。