【发布时间】:2021-04-12 07:04:31
【问题描述】:
从 Serial 填充数组时遇到问题。 所以基本上,首先要求数组的长度,然后应该从键盘输入所有元素。问题是它没有等待将值输入到 Serial 中而只是用 0 填充。如果立即输入值,它会将它们放入数组中。
我的问题是如何强制从 Arduino 等待,直到我输入值。 谢谢!
boolean fill = false;
int sum = 0;
int lengthOfArray;
void setup()
{
Serial.begin(9600);
Serial.print("Set lenght of array : ");
}
void loop()
{
if(fill == false)
{
if(Serial.available() > 0)
{
lengthOfArray = Serial.parseInt();
Serial.println(lengthOfArray);
int tab[lengthOfArray];
for(int i = 0; i < lengthOfArray; i++)
{
delay(10);
Serial.print("Tab[" + String(i) + "] : ");
tab[i] = Serial.parseInt();
Serial.println(tab[i]);
sum += tab[i];
}
fill = true;
Serial.println("Sum = " + String(sum));
}
}
}
【问题讨论】:
-
这不是按要求强制等待,但您可以使用
Serial.setTimeout()延长超时时间。 -
推荐的样式是
if (!fill)而不是if (fill == false)-bool表达式可以在条件中直接计算(因为fill无论如何都是bool变量)而不是与布尔值进一步比较. -
int tab[lengthOfArray];此语句(VLA - 可变长度数组,动态分配在堆栈上)不符合 C++。虽然它适用于 C 和一些 C++ 编译器,但如果你想成为 C++ 惯用的,它应该看起来像:std::vector<int> tab(lengthOfArray, 0);。但是,如果这是 C 意图的,那么您不必这样做。 -
每次通过
loop时,您都会从一个新的tab[]数组重新开始。可能不是你想要的。另外,我认为我们需要让loop()返回 Arduino 支持代码,以便它收集字符以进行串行读取...也许重新考虑如何通过循环每次一个接一个地收集整数,并存入它们位于loop()之外的全局数组中。在这种情况下,也应该检查数组限制以避免溢出。 (问:如果读取的第一个整数恰好是 0 怎么办?相信用户输入总是很危险的。) -
它旨在使所有内容在一个循环中完成。正在考虑为每个循环填充一个数组,但不知道如何在不知道长度的情况下将数组设为全局值。此外,假设我们提供固定输入,它不应该非常了解错误输入,只需简单地填充数组即可。谢谢