因此,我有两个传感器的设置,当我提示输入时,它们会捕获一组数据。
void loop() {
..
else if (serialString == "5")
{
String outputString = returnMeasurements(3);
}
}
String returnMeasurements(int sensorType)
{
if (sensorType == 1 || sensorType == 3)
{
//do assay
String NIRString = "SOME DATA HERE" // Gather data from sensor and append to NIRSTRING
}
if (sensorType == 2 || sensorType == 3)
{
//do assay
String VISString = "SOME DATA HERE" // Gather data from sensor and append to VISSTRING
}
Serial.print("TEST");
Serial.print(NIRString + VISString); //HERE IS WHEN THINGS SOMETIMES GO WRONG
return NIRString + VISString;
}
我已经大大简化了上面的代码,因此这里仅提供基本内容。
我的问题是,即使Serial.print
和return
包含数据,有时NIRString
语句上方的VISString
语句也不显示任何内容。 (意味着什么也没返回)
它似乎是随机发生的,但是却经常发生。
我怀疑,由于NIRString
和VISString
是很长的字符串,因此它会占用内存吗?除此之外,我不知道怎么了。
答案 0 :(得分:0)
可变阴影。
在计算机编程中,当在某个范围(决策块,方法或内部类)中声明的变量与在外部范围中声明的变量具有相同的名称时,就会发生变量遮蔽。
您尚未发布最少的工作示例,并且可能已省略了全局变量。但是,如果您能够编译它,那么它肯定在那里。删除两个全局变量声明:String NIRString;
和String VISString;
。现在不会编译。但这也意味着您要在if块{}
内更改完全不同的变量。
将变量尽可能保持局部。它不能在if(){块内; }。
String returnMeasurements(int sensorType)
{
String result;
if (sensorType == 1 || sensorType == 3)
{
//do assay
result += "SOME DATA HERE"; // Gather data from sensor and append to NIRSTRING
}
if (sensorType == 2 || sensorType == 3)
{
//do assay
result += "SOME DATA HERE"; // Gather data from sensor and append to VISSTRING
}
Serial.print("TEST");
Serial.print(result); //HERE IS WHEN THINGS SOMETIMES GO WRONG
return result;
}
但是,这在Arduino平台上占用了大量内存,因此完全不建议使用String串联。不错的文章:The Evils od Arduino Strings