Arduino 上 BME280 和字符数组的问题
Problem with BME280 and char arrays on Arduino
在使用 Ardino UNO 从 BME280 读取气压之前,我试图用数字引脚 7(来自雨量计的数据)中的 1800 个字符填充一个字符数组。结果通过 USB 使用 Serial.println 打印。
#include <Adafruit_BME280.h>
#define DATA 7
Adafruit_BME280 bme;
void setup()
{
Serial.begin(9600);
bme.begin(0x76);
pinMode(DATA, INPUT);
}
void loop()
{
int rmax = 1800; //1460
char r[rmax+1]; // changed from r[rmax]
int i;
for (i = 0; i < rmax; i++)
{
if (digitalRead(DATA) == 1)
r[i] = '1';
else
r[i] = '0';
}
r[rmax] = '[=10=]';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果数组大小大于1460,则不从BME280读取数据,打印数组时不换行。
谁能告诉我为什么,如果数组的大小是 1800,怎样才能成功?
您似乎遇到了堆栈溢出问题。
如您在 ATMega328 数据表 here or here 中所见,您只有 2KB RAM。 ATMega328/ATMega328P 通常用作 Arduino UNO 板的基本 MCU。
要检查这一点,您可以将数组 char r[rmax];
设为静态并修复缓冲区溢出问题,如 Ian 所说。
在这里您可以找到带有修复的代码:
// ...
// you previous code here
// NOTE: next row was added
#define rmax 1800
void loop()
{
// NOTE: next row was changed
static char r[rmax + 1];
int i;
for (i = 0; i < rmax; i++)
{
if (digitalRead(DATA) == 1)
r[i] = '1';
else
r[i] = '0';
}
r[rmax] = '[=10=]';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果你的代码编译有问题,就是栈溢出问题(RAM结束)。
在使用 Ardino UNO 从 BME280 读取气压之前,我试图用数字引脚 7(来自雨量计的数据)中的 1800 个字符填充一个字符数组。结果通过 USB 使用 Serial.println 打印。
#include <Adafruit_BME280.h>
#define DATA 7
Adafruit_BME280 bme;
void setup()
{
Serial.begin(9600);
bme.begin(0x76);
pinMode(DATA, INPUT);
}
void loop()
{
int rmax = 1800; //1460
char r[rmax+1]; // changed from r[rmax]
int i;
for (i = 0; i < rmax; i++)
{
if (digitalRead(DATA) == 1)
r[i] = '1';
else
r[i] = '0';
}
r[rmax] = '[=10=]';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果数组大小大于1460,则不从BME280读取数据,打印数组时不换行。 谁能告诉我为什么,如果数组的大小是 1800,怎样才能成功?
您似乎遇到了堆栈溢出问题。
如您在 ATMega328 数据表 here or here 中所见,您只有 2KB RAM。 ATMega328/ATMega328P 通常用作 Arduino UNO 板的基本 MCU。
要检查这一点,您可以将数组 char r[rmax];
设为静态并修复缓冲区溢出问题,如 Ian 所说。
在这里您可以找到带有修复的代码:
// ...
// you previous code here
// NOTE: next row was added
#define rmax 1800
void loop()
{
// NOTE: next row was changed
static char r[rmax + 1];
int i;
for (i = 0; i < rmax; i++)
{
if (digitalRead(DATA) == 1)
r[i] = '1';
else
r[i] = '0';
}
r[rmax] = '[=10=]';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果你的代码编译有问题,就是栈溢出问题(RAM结束)。