c - Arduino 在大约 9 个循环后停止执行

标签 c arduino

我有一个草图,在停止之前将执行大约 9 次。我尝试释放我在主循环中声明的所有数组,但在停止之前将循环数减少到 2。

根据 MemoryFree 的说法,我让它检查可用内存,看看它是否用完了,但似乎没有泄漏。也许我编码有误?

// nrf24_reliable_datagram_client.pde
// -*- mode: C++ -*-
// Example sketch showing how to create a simple addressed, reliable messaging client
// with the RHReliableDatagram class, using the RH_NRF24 driver to control a NRF24 radio.
// It is designed to work with the other example nrf24_reliable_datagram_server
// Tested on Uno with Sparkfun WRL-00691 NRF24L01 module
// Tested on Teensy with Sparkfun WRL-00691 NRF24L01 module
// Tested on Anarduino Mini (http://www.anarduino.com/mini/) with RFM73 module
// Tested on Arduino Mega with Sparkfun WRL-00691 NRF25L01 module

#include <RHReliableDatagram.h>
#include <RH_NRF24.h>
#include <SPI.h>
#include <DHT.h>
#include <MemoryFree.h>

DHT dht(5, DHT22);
#define CLIENT_ADDRESS 1
#define SERVER_ADDRESS 2

// Singleton instance of the radio driver
RH_NRF24 driver;
// RH_NRF24 driver(8, 7);   // For RFM73 on Anarduino Mini

// Class to manage message delivery and receipt, using the driver declared above
RHReliableDatagram manager(driver, CLIENT_ADDRESS);

void setup() 
{
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  if (!manager.init())
    Serial.println("init failed");
  // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
  dht.begin();
}

uint8_t data[70];
// Dont put this on the stack:
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];

void looop()
{
  byte data[2];

  getdat(&data[0]);
}

void getdat(byte *pdata)
{
  pdata[0] = 'a';
  pdata[1] = 'b';
}

double getAvgRead(int readDelay, int iterations, double* result){
  int startMillis = millis();
  int iterationStart, i;
  for (i = 0 ; i < iterations; i++){
    iterationStart = millis();

    digitalWrite(13,HIGH);
    result[0] += dht.readTemperature(true);
    //Serial.println(result[0]);
    result[1] += dht.readHumidity();
    digitalWrite(13,LOW);

    delay(readDelay-millis()+iterationStart);
  }

  result[0] /= i; //divide by iterations to produce the average
  result[1] /= i;
  //Serial.println(result[0]);
}

int i = 0;
void loop()
{
  Serial.println("Sending, loop " + String(i++) + ", mem: " + String(freeMemory()));
  //int s = millis();
  double values[2] = {0,0};
  getAvgRead(2020,1,values);
  //Serial.println((millis()-s));

  uint8_t data[28];
  char str[28];
  sprintf(str,"U,DHT;T,%d;H,%d", (int)(values[0] * 100.0), (int)(values[1] * 100.0));
  memcpy(data,(uint8_t*)str,sizeof(str));
  Serial.println((char*)data);

  // Send a message to manager_server
  if (manager.sendtoWait(data, sizeof(data), SERVER_ADDRESS))
  {
    // Now wait for a reply from the server
    uint8_t len = sizeof(buf);
    uint8_t from;   

    manager.recvfromAckTimeout(buf, &len, 2000, &from);
  }
  else
    Serial.println("sendtoWait failed");
}

引入getAvgRead函数导致了这个错误。也许我错过了什么?

编辑:该草图旨在多次从 DHT 传感器读取数据,计算读数的平均值,然后将其传输到另一个 arduino。

最佳答案

我不太确定你想用这个草图实现什么,但看过代码后我怀疑你的问题是这条线:

delay(readDelay-millis()+iterationStart);

我怀疑您正在尝试使每次迭代都精确地花费 readDelay 毫秒。如果迭代花费的时间比 readDelay 长,则延迟将为负数。我假设一个负的 delay 参数将环绕成一个非常大的无符号整数。也许您应该检查计算出的延迟,如果延迟为负,则跳过该延迟。

此外,正如@m0nk3y 在评论中建议的那样,您还应该将readDelaystartMillisiterationStart 变量更改为 unsigned longs.

这个 delay 肯定是我首先要开始寻找的地方。当然,也完全有可能我找错了树。

关于c - Arduino 在大约 9 个循环后停止执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24593029/

相关文章:

c - 使用 arduino 和 C 初始化串行接口(interface)

c - 在 Arduino 上将 byte 转换为 int 时数据丢失

c++ - 为什么我不能在 if 循环中使用动态变量?

c - eclipse中的静态库链接

c++ - 为什么我不能 scanf 和 printf 一个整数?

c - 在c中对结构数组进行排序

根据 if 语句更改数组值

python - 我尝试以 100hz 采样,而不是按照程序运行的速度采样。我该怎么做呢?

c - while 循环,从 scanf 读取 int 与 char,true 和 false

c - 简单的 do while 循环使用 while(true);