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
相关产品推荐
相关产品推荐

