Arduino子串不起作用

时间:2015-06-15 22:47:29

标签: c++ arduino substring

我有一个静态方法,用于搜索(并返回)字符串msg TAG

之间的值

这是代码函数:

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的专家,但这看起来像是一个潮红或缓冲的问题,不是吗?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的代码是正确的,这不应该发生。这迫使你考虑这可能失败的意外方式。实际上只有一个我能想到的候选人事故,你的Arduino用完RAM。它很少,Uno只有2千字节。它并没有采取大量的字符串咀嚼来填补它。

这没有顺利报道。我所能做的只是指向相关的company page。引用:

  

如果SRAM耗尽,您的程序可能会以意想不到的方式失败;它似乎成功上传,但没有运行,或运行奇怪。要检查是否发生这种情况,您可以尝试注释或缩短草图中的字符串或其他数据结构(不更改代码)。如果它成功运行,您可能已经耗尽了SRAM。您可以采取一些措施来解决此问题:

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

在您的具体案例中,这不是很有帮助,您必须查看该计划的其余部分以供候选人使用。或升级您的硬件,StackExchange为Arduino爱好者提供dedicated site,肯定是获得建议的最佳地点。