Arduino Nano使用SD.h向CSV文件追加数据时fseek失效问题求助
问题排查与解决方法
核心逻辑错误
你当前代码的写入逻辑仅在文件不存在时才会执行,若文件已经创建过,整个if (!SD.exists("filename.csv"))代码块会直接跳过,自然不会写入任何新内容,这是最主要的问题。
其他常见问题点
- 文件名不匹配:注释里标注要写
ensayo.csv,但实际代码操作的是filename.csv,容易出现找错文件误以为写入失败的问题。 fseek用法错误:Arduino官方SD库的文件定位推荐使用seek()方法,而非底层的fseek,定位到文件末尾的正确写法如下,不需要提前执行读操作,写入模式下直接调用seek即可生效:myFile.seek(myFile.size());- SD卡兼容性问题:SD.h仅支持FAT16/FAT32格式的SD卡,容量超过32G的SDXC卡默认是exFAT格式,无法被识别,同时需要确认SPI接线、片选引脚配置正确,SD卡供电稳定。
修正后的代码示例
void init_SD(void) { Serial.print("Iniciando SD ..."); if (!SD.begin(chip_select)) { Serial.println("No se pudo inicializar"); return; } Serial.println("Inicializacion exitosa"); bool fileIsNew = !SD.exists("ensayo.csv"); // 统一打开文件,O_APPEND标志可直接让所有写入操作追加到末尾,无需手动seek myFile = SD.open("ensayo.csv", FILE_WRITE | O_APPEND); if (myFile) { // 仅新文件需要写入表头 if (fileIsNew) { myFile.println("Titulo Archivo"); myFile.println("Hora de Medicion,Tiempo [s],Corriente [A]"); } // 这里写你需要追加的日常测量数据 // myFile.println(数据内容); myFile.close(); } else { Serial.println("Error abriendo el archivo"); } }
调试技巧
写入操作后可以打印返回值确认是否写入成功:
int writeLen = myFile.println("测试内容"); Serial.print("写入字节数:"); Serial.println(writeLen); // 返回0说明写入失败,大于0为成功
内容的提问来源于stack exchange,提问作者Juan Fixed
相关产品推荐
相关产品推荐

