在使用Arduino UNO读取BME280的空气压力之前,我正在尝试用数字引脚7(雨量计数据(中的1800个字符(1和0(填充字符阵列。通过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] = ' ';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果阵列的大小大于1460,则不从BME280读取数据,并且在不进行行移位的情况下打印阵列。有人能告诉我为什么吗?如果阵列的大小是1800,该怎么办才能成功?
看起来有堆栈溢出问题。
正如您在ATMega328数据表中看到的,您只有2KB的RAM。ATMega328/AMega328P通常用作Arduino UNO板的基本MCU。
要检查这一点,可以将数组char r[rmax];
设置为static&修复缓冲区溢出问题,正如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] = ' ';
Serial.println(r);
Serial.println(bme.readPressure());
delay(1000);
}
如果您在编译代码时遇到问题,则会出现堆栈溢出问题(RAM结束(。
通过将4位的组组合为十六进制数,可以省略此问题。这将使char数组的大小减少1/4。
char code_bin_to_hex(char bin[])
{
char hex;
if (strcmp(bin, "0000") == 0)
hex= '0';
else if (strcmp(bin, "0001") == 0)
hex = '1';
else if (strcmp(bin, "0010") == 0)
hex = '2';
....
else if (strcmp(bin, "1110") == 0)
hex = 'e';
else if (strcmp(bin, "1111") == 0)
hex = 'f';
else
hex = '?';
return hex;
}