【问题标题】:Arduino function interfering with loop() codeArduino 函数干扰 loop() 代码
【发布时间】:2013-06-18 12:26:57
【问题描述】:

我在循环函数中有以下几行:

item = String(buffer);
Serial.println(item);  

其中 item 是 String 并且 buffer 是 char 数组。在我在文件末尾(循环函数之外)添加一个函数之前,这非常有效:

void storeData(String item){
  Serial.println("StoreData");
  for (int k=0; k<11; k++){
    Serial.print("*");
    if(item == products[k]){
      items[index] = names[k];
      index++;
      Serial.print("\n");
      Serial.print(item);
      Serial.print("\t");
      Serial.print(names[k]);
    }
  }
}

它将字符串item 与值列表进行比较,如果找到值,则存储相应的名称。 当我在最后添加这段代码时,即使我不调用该函数,转换的输出也变为:

978973103 Á
9789731030418

第一个值是错误的转换,第二个是buffer的值。

可能会发生什么?我一遍又一遍地重新启动、重新布线和重做一切。

【问题讨论】:

  • 如果没有内存问题(内存不足),您确定 item = String(buffer) 复制了一个空终止的数组吗?分配后立即快速打印应该可以解决这个问题。如果项目是正确的,正如其他人指出的那样,MemoryFree 库很好用,至少在开发期间可以密切关注可用内存。
  • 数组包含不超过 14 个字符(数字)。它被正确打印(9789731030418),而不是混乱的转换978973103 Á ...
  • 有一次我遇到了一个奇怪的问题,我将一个 char 缓冲区传递给一个函数,一段时间后程序状态会变得很奇怪。我从函数调用中删除了 char 缓冲区并将其用作全局变量,一切都很好。我还读到String类型在早期版本中有一些分配错误,你的编译器是什么版本?
  • 谷歌搜索字符串分配错误google.ca/…

标签: arrays arduino


【解决方案1】:

您的 2K SRAM 可能已用完。字符串数组可以很快用完。

此外,我建议使用F() 函数,因为不要使用 RAM 来表示常量。例如Serial.println(F("StoreData");

最新的 IDE 显示了预期的 RAM 使用情况。但这是一个猜测。如果它甚至接近,则可能存在问题。我在代码中的特定点使用以下MemoryFree library 来揭示高水位。

【讨论】:

  • 我考虑过内存问题,但怎么可能呢?一个有 12 次迭代的 for 和一个 if 甚至没有被调用?
  • 它实际上是 RAM。通过排除发现它是我正在使用的 GLCD。只有 library 和 inits 在草图中占用 5k。我什至无法想象它占用了多少内存。感谢您抽出宝贵时间回答!
【解决方案2】:

因为项目是字符串。我想你可以尝试使用

Serial.println(item);

而不是

Serial.print(item);

在你的 storeData 函数中。其他字符串也类似

【讨论】:

    猜你喜欢
    • 2021-10-13
    • 2022-11-15
    • 2011-01-19
    • 1970-01-01
    • 2017-04-17
    • 2018-02-26
    • 2014-11-27
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多