You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MPU9255传感器数据无法写入SD卡的问题求助

MPU9255数据写入SD卡失败问题解决

问题描述

尝试将MPU9255传感器的数据写入SD卡时,始终提示Failed to open file for writing。已确认接线无问题,MPU9255的数据可正常读取。

原代码如下:

#include <MPU9255.h>  // Include MPU9255 library
#include "FS.h"
#include "SD.h"
#include <SPI.h>

MPU9255 mpu;  // Create MPU9255 object

#define SD_CS 5  // Chip select pin for the SD card

void setup() {
  Serial.begin(115200);
  if (!mpu.init()) {
    Serial.println("MPU9255 initialization successful!");
  } else {
    Serial.println("MPU9255 initialization failed!");
    return;
  }

  if (!SD.begin(SD_CS)) {
    Serial.println("Card Mount Failed");
    return;
  } else {
    Serial.println("SD card initialized.");
  }

  File file = SD.open("/data.txt", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  } else {
    if (file.size() == 0) {
      file.println("AX, AY, AZ, GX, GY, GZ, MX, MY, MZ");
    }
    file.close();
    Serial.println("File opened and header written.");
  }
}

void loop() {
  // Read data from MPU9255
  mpu.read_acc();
  mpu.read_gyro();
  mpu.read_mag();

  // Log data to Serial Monitor for debugging
  Serial.print("AX: ");
  Serial.print(mpu.ax);
  Serial.print(" AY: ");
  Serial.print(mpu.ay);
  Serial.print(" AZ: ");
  Serial.print(mpu.az);
  Serial.print("GX: ");
  Serial.print(mpu.gx);
  Serial.print(" GY: ");
  Serial.print(mpu.gy);
  Serial.print(" GZ: ");
  Serial.print(mpu.gz);
  Serial.print("MX: ");
  Serial.print(mpu.mx);
  Serial.print(" MY: ");
  Serial.print(mpu.my);
  Serial.print(" MZ: ");
  Serial.println(mpu.mz);

  // Write data to SD card
  logSDCard();
  delay(1000);  // Delay between reads
}

void logSDCard() {
  // Open the SD card file in append mode
  File file = SD.open("/data.txt", FILE_APPEND);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;  // Stop function execution if file cannot be opened
  }

  // Format the data string
  String dataMessage = String(mpu.ax) + ", " + String(mpu.ay) + ", " + String(mpu.az) + ", " 
                       + String(mpu.gx) + ", " + String(mpu.gy) + ", " + String(mpu.gz) + ", " 
                       + String(mpu.mx) + ", " + String(mpu.my) + ", " + String(mpu.mz);

  // Print on Serial Monitor for debugging
  Serial.print("Save data: ");
  Serial.println(dataMessage);

  // Write the data message to SD card
  file.println(dataMessage);

  // Check for write errors
  if (file.getWriteError()) {
    Serial.println("Error writing to file.");
    file.clearWriteError();  // Clear the error code.
  }

  // Close the file to save the data
  file.close();
}

解决方案

1. 修正MPU初始化逻辑错误

原代码中mpu.init()的判断逻辑完全写反了。通常传感器库的init()函数返回true表示初始化成功,false表示失败。修改后:

if (mpu.init()) {
  Serial.println("MPU9255 initialization successful!");
} else {
  Serial.println("MPU9255 initialization failed!");
  return;
}

2. 调整SD卡文件路径

去掉路径前的斜杠,直接使用data.txt,部分SD库对根目录路径的斜杠处理存在兼容性问题:

File file = SD.open("data.txt", FILE_WRITE);
// 以及logSDCard函数中的
File file = SD.open("data.txt", FILE_APPEND);

3. 验证SD卡兼容性与格式

  • 确保SD卡为FAT32格式,容量不超过32GB(大容量SDXC卡可能无法被Arduino类设备识别)。
  • 尝试更换一张已知可用的SD卡,排除卡损坏或兼容性问题。

4. 添加SD卡状态验证

在打开文件前,添加卡状态和文件存在性检查,便于排查:

// 在setup的SD初始化后添加
uint8_t cardType = SD.cardType();
if(cardType == CARD_NONE){
  Serial.println("No SD card attached");
  return;
}
Serial.print("SD Card Type: ");
if(cardType == CARD_MMC){
  Serial.println("MMC");
} else if(cardType == CARD_SD){
  Serial.println("SDSC");
} else if(cardType == CARD_SDHC){
  Serial.println("SDHC");
} else {
  Serial.println("Unknown");
}

修改后的完整代码

#include <MPU9255.h>
#include "FS.h"
#include "SD.h"
#include <SPI.h>

MPU9255 mpu;
#define SD_CS 5

void setup() {
  Serial.begin(115200);
  
  // 修正MPU初始化逻辑
  if (mpu.init()) {
    Serial.println("MPU9255 initialization successful!");
  } else {
    Serial.println("MPU9255 initialization failed!");
    return;
  }

  if (!SD.begin(SD_CS)) {
    Serial.println("Card Mount Failed");
    return;
  }
  Serial.println("SD card initialized.");

  // 验证SD卡类型
  uint8_t cardType = SD.cardType();
  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }
  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("Unknown");
  }

  // 调整文件路径
  File file = SD.open("data.txt", FILE_WRITE);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  } else {
    if (file.size() == 0) {
      file.println("AX, AY, AZ, GX, GY, GZ, MX, MY, MZ");
    }
    file.close();
    Serial.println("File opened and header written.");
  }
}

void loop() {
  mpu.read_acc();
  mpu.read_gyro();
  mpu.read_mag();

  Serial.print("AX: ");
  Serial.print(mpu.ax);
  Serial.print(" AY: ");
  Serial.print(mpu.ay);
  Serial.print(" AZ: ");
  Serial.print(mpu.az);
  Serial.print("GX: ");
  Serial.print(mpu.gx);
  Serial.print(" GY: ");
  Serial.print(mpu.gy);
  Serial.print(" GZ: ");
  Serial.print(mpu.gz);
  Serial.print("MX: ");
  Serial.print(mpu.mx);
  Serial.print(" MY: ");
  Serial.print(mpu.my);
  Serial.print(" MZ: ");
  Serial.println(mpu.mz);

  logSDCard();
  delay(1000);
}

void logSDCard() {
  // 调整文件路径
  File file = SD.open("data.txt", FILE_APPEND);
  if (!file) {
    Serial.println("Failed to open file for writing");
    return;
  }

  String dataMessage = String(mpu.ax) + ", " + String(mpu.ay) + ", " + String(mpu.az) + ", " 
                       + String(mpu.gx) + ", " + String(mpu.gy) + ", " + String(mpu.gz) + ", " 
                       + String(mpu.mx) + ", " + String(mpu.my) + ", " + String(mpu.mz);

  Serial.print("Save data: ");
  Serial.println(dataMessage);

  file.println(dataMessage);

  if (file.getWriteError()) {
    Serial.println("Error writing to file.");
    file.clearWriteError();
  }

  file.close();
}

内容的提问来源于stack exchange,提问作者Andi Muhammad Alif Alfajra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:17:02