You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino如何通过Serial/OLED打印当前数组中的函数名称?

问题描述

我找到一个包含多种LED图案的Arduino程序,可通过按键切换图案,运行正常。现在想为其添加OLED显示屏,显示当前图案的编号和名称。编号可以正常打印,但尝试打印图案名称时出现错误:no matching function for call to 'println(void (*&)())'。

相关代码如下:

typedef void (*SimplePatternList[])();
SimplePatternList gPatterns = { PurpleRipple, twoDots, fillAndCC, blinkyblink2, spewFour, spew, confetti_GB, rainbow, confetti, sinelon, juggle };

uint8_t gCurrentPatternNumber = 0; // Index number of which pattern is current

循环内通过gPatterns[gCurrentPatternNumber]();调用对应编号的图案,例如编号0对应PurpleRipple。使用oled.print(gCurrentPatternNumber);可以正常打印0、1、2等编号,但使用oled.print(gPatterns[gCurrentPatternNumber]);时出错,Serial.print也有同样问题。请问如何正确通过Serial/OLED打印当前图案的函数名称?

解决方法

函数指针仅存储函数的内存地址,Arduino的print/println函数无法直接将函数指针转换为函数名称字符串,需手动建立函数名称与索引的对应关系:

  • 创建图案名称字符串数组
    新建一个与gPatterns长度、索引完全匹配的字符串数组,每个元素对应图案函数的名称:

    const char* gPatternNames[] = {
        "PurpleRipple",
        "twoDots",
        "fillAndCC",
        "blinkyblink2",
        "spewFour",
        "spew",
        "confetti_GB",
        "rainbow",
        "confetti",
        "sinelon",
        "juggle"
    };
    

    需确保数组元素数量、顺序与gPatterns完全一致,保证索引一一对应。

  • 打印图案名称
    通过当前图案编号gCurrentPatternNumber访问字符串数组元素,即可正常打印:

    // OLED打印编号与名称
    oled.print(gCurrentPatternNumber);
    oled.print(": ");
    oled.println(gPatternNames[gCurrentPatternNumber]);
    
    // Serial打印同理
    Serial.print(gCurrentPatternNumber);
    Serial.print(": ");
    Serial.println(gPatternNames[gCurrentPatternNumber]);
    
  • 后续维护提示
    若新增图案,需同时在gPatterns和gPatternNames两个数组中添加对应的函数与名称,保持索引一致,避免对应错误。

内容的提问来源于stack exchange,提问作者Mister Woyng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:55:18