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结束)。