Arduino超声波传感器数组索引0值无法正常打印问题求助
问题分析与解决方案
我一眼就发现了问题的根源——你在math()函数里的变量初始化错误触发了未定义行为,进而影响了数组第一个元素的正常输出。
问题详情
你在math()函数里重新声明了int minIndex;这个局部变量,但没有给它初始化,它的值是内存里的随机垃圾值。接下来执行int minValue = myDist[minIndex];时,用这个随机索引去访问数组,属于非法数组越界访问。这种操作会导致:
- 读取到完全随机的无效值;
- 更严重的是,可能破坏内存中其他变量的存储(包括你的
myDist[0]),这就是第一个传感器数据无法正常输出的原因。
另外,你全局已经定义了minIndex,但局部声明覆盖了全局变量,导致全局变量根本没被用到。
修复后的代码
只需要修改math()函数,正确初始化最小值的索引和对应值即可,推荐使用局部变量(避免全局变量污染):
void math() { int myDist_length = sizeof(myDist) / sizeof(myDist[0]); // 获取数组长度 int minIndex = 0; // 初始索引指向第一个元素 int minValue = myDist[minIndex]; // 初始最小值设为第一个元素的值 for(byte j = 1; j < myDist_length; j++){ // 从第二个元素开始遍历 if(myDist[j] < minValue) { minValue = myDist[j]; minIndex = j; } } // 如果需要打印最小值和索引可以取消下面注释 // Serial.print("Min Value: "); // Serial.print(minValue); // Serial.print(", Index: "); // Serial.println(minIndex); Serial.print(myDist[0]); Serial.println(); }
额外优化建议
- 如果全局的
minIndex和minValue没有在其他函数中使用,可以直接删除,减少不必要的全局变量; - 你可以在
loop()里的循环中加入打印,先确认myDist[0]在赋值后是否正常,比如:
这样可以更快定位数据是在赋值阶段还是后续处理阶段出的问题。for (uint8_t i = 0; i < SONAR_NUM; i++) { delay(30); myDist[i] = sonar[i].ping_cm(); Serial.print("myDist["); Serial.print(i); Serial.print("]: "); Serial.println(myDist[i]); }
内容的提问来源于stack exchange,提问作者Cmerdman
相关产品推荐
相关产品推荐

