Arduino 子字符串不起作用

Arduino substring doesn't work

本文关键字:不起作用 字符串 Arduino      更新时间:2023-10-16

>我有一个静态方法,可以将 TAG 之间的值搜索(并返回)到 String msg 中

这是代码函数:

static String genericCutterMessage(String TAG, String msg){
    Serial.print("a-----");
    Serial.println(msg);
    Serial.print("b-----");
    Serial.println(TAG);
    if(msg.indexOf(TAG) >= 0){
        Serial.print("msg ");
        Serial.println(msg);
        int startTx = msg.indexOf(TAG)+3;
        int endTx = msg.indexOf(TAG,startTx)-2;
        Serial.print("startTx ");
        Serial.println(startTx);
        Serial.print("endTx ");
        Serial.println(endTx);
        String newMsg = msg.substring(startTx,endTx);
        Serial.print("d-----");
        Serial.println(newMsg);
        Serial.println("END");
        Serial.println(newMsg.length());
        return newMsg;
    } else {
        Serial.println("d-----TAG NOT FOUND");
        return "";
    }
}

这是输出

a-----[HS][TS]5132[/TS][TO]5000[/TO][/HS]
b-----HS
msg [HS][TS]5132[/TS][TO]5000[/TO][/HS]
startTx 4
endTx 30
d-----
END
0
fake -_-'....go on!  <-- print out of genericCutterMessage

在这种情况下,我想返回 HS 标签之间的字符串,所以我的预期输出是

[TS]5132[/TS][TO]5000[/TO]

但我不知道为什么我会收到一个空字符串。

为了了解子字符串的工作原理,我只是按照 Arduino 官方网站上的教程进行操作

http://www.arduino.cc/en/Tutorial/StringSubstring

我不是C++和Arduino的专家,但这看起来像是一个刷新或缓冲问题,不是吗?

知道吗?

你的代码是正确的,这不应该发生。 这迫使您考虑这可能失败的意外方式。 我能想到的候选人事故真的只有一个,你的 Arduino 内存快用完了。 它很少,例如 Uno 只有 2 KB。 不需要很多字符串咀嚼来填充它。

这不是以顺利的方式报告的。 我所能做的就是将您指向相关的公司页面。 引用:

如果SRAM用完,程序可能会以意外的方式失败;它看起来上传成功,但没有运行,或者运行异常。要检查是否发生这种情况,您可以尝试注释掉或缩短草图中的字符串或其他数据结构(无需更改代码)。如果它随后成功运行,则您的SRAM可能用完了。您可以采取一些措施来解决此问题:

  • 如果您的草图与(台式机/笔记本电脑)计算机上运行的程序对话,您可以尝试将数据或计算转移到计算机上,从而减少 Arduino 上的负载。
  • 如果您有查找表或其他大型数组,请使用存储所需值所需的最小数据类型;例如,int 占用两个字节,而一个字节仅使用一个字节(但可以存储较小范围的值)。
  • 如果在草图运行时不需要修改字符串或数据,则可以将它们存储在闪存(程序)存储器而不是SRAM中;为此,请使用PROGMEM关键字。

这在您的特定情况下不是很有帮助,您必须查看候选人计划的其余部分。 或者升级您的硬件,StackExchange 为Arduino爱好者提供了一个专门的网站,这无疑是获得建议的最佳场所。