c++ - Arduino数组中的损坏值
问题描述
该程序应该不断收听来自花盆中土壤湿度传感器的 433 MHz 信息,并根据这些读数决定是否启动泵。
此外,它应该在收听时检查有线水传感器。
所有 433 MHz 接收到的消息都应存储在阵列sensor_data[i]
中。
在启动时,1
到NUM_Sensors
(在本例中为 3)的位置用常量 int NO_DATA
(500) 填充。
问题是,由于某种原因,我在数组 3 中得到损坏的 Number:
串行打印:
Wired Flower Pots Checked
All Sensors or Timeout reached
Array_Print: 500
Array_Print: 500
Array_Print: 30001
在这种情况下, 30001 没有特定原因出现在数组中(我猜).. 没有收到消息。
这里的代码更改为最小,以便发生错误:
#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
//Receiver Setup for wireless soil moisture readings
unsigned long last_ground_check = 0;
const int NUM_SENSORS = 3;
const uint32_t SENSOR_TIMEOUT = 30000;
int sensor_data[NUM_SENSORS];
uint32_t last_message_time = 0;
uint32_t elapsed = 0;
float total_value = 0;
float real_value = 0;
int count = 0;
const int NO_DATA = 500;
boolean received = false;
//###################//
void setup()
{
Serial.begin(9600);
mySwitch.enableReceive(INT1); // Interrupt 2 = Pin 2
delay(1500);
Serial.println("<><><><><><><><><><><><>");
Serial.println(" Start ");
Serial.println("<><><><><><><><><><><><>");
for (int i = 0; i <= NUM_SENSORS; i++) {
sensor_data[i] = NO_DATA;
}
} // Setup END
void loop()
{
if (received == false) {
if (millis() - last_ground_check > 10000) {
Serial.println("Checking Wired Flower Pot");
}
Serial.println("Wired Flower Pots Checked");
last_ground_check = millis();
}
if (mySwitch.available()) { // Start whenever a 433 MHz Message is received
received = true;
double value = mySwitch.getReceivedValue();
delay(1000);
int sensor_id = 1;
int sensor_value = 2;
if (sensor_value >= 0 && sensor_value <= 100) {
sensor_data[sensor_id] = sensor_value;
last_message_time = millis();
mySwitch.resetAvailable();
}
}
byte sensors_reported = 0;
for (int i = 0; i <= NUM_SENSORS; i++) {
if (NO_DATA != sensor_data[i]) {
sensors_reported += 1; // CODE Gets here because of corrupted Array Value although no message was received
}
}
if (sensors_reported != 0) {
uint32_t elapsed = millis() - last_message_time;
if (NUM_SENSORS == sensors_reported || elapsed > SENSOR_TIMEOUT) {
Serial.println("All Sensors or Timeout reached");
for (int i = 1; i <= NUM_SENSORS; i++) {
Serial.print("Array_Print: ");
Serial.println(sensor_data[i]);
}
for (int i = 1; i <= NUM_SENSORS; i++) {
if (sensor_data[i] < NO_DATA) {
count++;
total_value += sensor_data[i];
}
}
real_value = total_value / count;
Serial.print("Soil Moisture: ");
Serial.println(real_value);
if (real_value <= 20) {
//Set Pump ON
}
for (int i = 1; i <= NUM_SENSORS; i++) {
sensor_data[i] = NO_DATA;
}
total_value = 0;
real_value = 0;
sensors_reported = 0;
count = 0;
received = false;
Serial.println("RESET #### RESET ####");
delay(5000);
}
}
} //LOOP
解决方案
您首先分配一个大小为 4 的数组NUM_SENSORS=3
,然后继续使用它,就像它的大小为 4 一样。
您的数组有 3 个元素sensor_data[0]
,[1]
并且[2]
. 您的循环条件i <= NUM_SENSORS
导致访问sensor_data[3]
最后一个数组元素之后的一些内存。即使您在设置sensor_data[3]
中进行了设置,如果其他变量引用了相同的内存,NO_DATA
也会被覆盖。
将数据数组上的循环从 索引i = 0
到i < NUM_SENSORS
。
推荐阅读
- javascript - Uncaught EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not a allowed source... in vue-pdf
- arguments - 我正在尝试使用 qqnorm() 函数从为另一列中不同感兴趣区域编码的列中的数据创建图
- c# - 委托如何返回字符串生成器?
- julia - 将整数向量转换为整数
- reactjs - 如何删除 React Typescript 中类型“{}”上不存在的属性“长度”
- python - C++ VTK 应用程序 UI 自动化
- c++ - 如何将 Rcpp::List 存储为类成员
- xpath - Xpath 在标签之间进行选择
- apache - apache2中conf、mods和站点的区别
- vert.x - PreparedStatement.close 抛出新的 IllegalStateException