C Arduino在大约9个循环后停止执行
我有一个草图,它将在停止之前执行大约9次。我尝试释放我在主循环中声明的所有数组,但在停止之前,循环数减少到了2 根据MemoryFree,我让它检查可用的内存,看看它是否正在耗尽,但似乎没有泄漏。也许我编错了什么C Arduino在大约9个循环后停止执行,c,arduino,C,Arduino,我有一个草图,它将在停止之前执行大约9次。我尝试释放我在主循环中声明的所有数组,但在停止之前,循环数减少到了2 根据MemoryFree,我让它检查可用的内存,看看它是否正在耗尽,但似乎没有泄漏。也许我编错了什么 // nrf24_reliable_datagram_client.pde // -*- mode: C++ -*- // Example sketch showing how to create a simple addressed, reliable messaging clien
// 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");
}
//nrf24\u可靠的数据报\u client.pde
//*-模式:C++
//演示如何创建简单、可靠的消息传递客户端的示例草图
//使用RHReliableDatagram类,使用RH_NRF24驱动程序控制NRF24收音机。
//它被设计用于与其他示例nrf24_可靠数据报_服务器一起工作
//使用Sparkfun WRL-00691 NRF24L01模块在Uno上测试
//使用Sparkfun WRL-00691 NRF24L01模块在Teensy上进行测试
//在Anarduino Mini上测试(http://www.anarduino.com/mini/)带RFM73模块
//使用Sparkfun WRL-00691 NRF25L01模块在Arduino Mega上进行测试
#包括
#包括
#包括
#包括
#包括
DHT-DHT(5,DHT22);
#定义客户端地址1
#定义服务器地址2
//收音机驱动程序的单例实例
RH_NRF24驱动器;
//右侧NRF24驱动器(8,7);//适用于阿纳迪诺Mini上的RFM73
//类使用上面声明的驱动程序管理消息传递和接收
RHReliableDatagram manager(驱动程序、客户端地址);
无效设置()
{
pinMode(13,输出);
Serial.begin(9600);
如果(!manager.init())
Serial.println(“初始化失败”);
//初始化后的默认值为2.402GHz(通道2),2Mbps,0dBm
dht.begin();
}
uint8_t数据[70];
//不要把这个放在堆栈上:
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
void looop()
{
字节数据[2];
getdat(&data[0]);
}
void getdat(字节*pdata)
{
pdata[0]=“a”;
pdata[1]=“b”;
}
double getAvgRead(int readDelay、int迭代、double*result){
int startMillis=millis();
int迭代开始,i;
对于(i=0;i
引入getAvgRead函数导致此错误。我错过了什么也许
编辑:此草图旨在从DHT传感器读取多次,平均读数,然后将其传输到另一个arduino。我不确定您试图通过此草图实现什么,但查看代码后,我怀疑您的问题在于:
delay(readDelay-millis()+iterationStart);
我怀疑您正试图使每次迭代精确地花费readDelay
毫秒。如果迭代花费的时间超过readDelay
,则延迟将为负。我假设一个负的delay
参数将环绕到一个非常大的无符号整数。也许您应该检查计算的延迟,如果延迟为负,则跳过延迟
此外,正如@m0nk3y在评论中所建议的,您还应该将readDelay
、startMillis
、和iterationStart
变量更改为无符号long
s
这个
延迟
肯定是我首先要看的地方。当然,也完全有可能是我找错了方向。那一行告诉它在余下的交互过程中暂停。应该与delay(readDelay-(millis()-iterationStart))相同。它计算自该迭代开始以来经过的毫秒数,然后等待,以使迭代持续X毫秒。readDelay的名字错了,因为我改变了参数,忘记了。是的,我刚刚意识到。如果将延迟设置为readDelay,会发生什么情况。草图是否停止运行。如果硬编码延迟值,可能只是将其设置为readDelay
,会发生什么情况?我还更新了我的答案,建议延迟可能是负面的。我只是将其更改为延迟(readDelay),并且它的执行时间是以前的两倍,这可能就是它的原因。我被难住了。我正在尝试delay(readDelay-(millis()-iterationStart))
看看这是否更有效。将millis变量更改为无符号长
是否有帮助?From:请注意,millis的参数是无符号long,如果程序员试图对其他数据类型(如int)进行运算,则可能会产生错误。