Arduino中如何从SD卡文本文件拆分字符串与整数
Arduino读取SD卡键值对文件并拆分存储的简便方法
你的问题在于仅用readStringUntil(':')只能读取冒号前的键名,剩余的数值和换行符会留在缓冲区,导致无法正确拆分键值。下面是更可靠的实现方式,通过逐行读取、拆分键值对来完成变量赋值:
完整代码
#include <SD.h> bool SDfound = false; File printFile; String buffer; // 定义存储参数的变量 int sampleTime = 0; int sampleInterval = 0; String phone = ""; void setup() { Serial.begin(9600); // 初始化SD卡 if (!SDfound) { if (!SD.begin(4)) { Serial.println("SD卡未找到"); while(1); // 卡初始化失败则死循环 } SDfound = true; } // 打开文件 printFile = SD.open("consta.txt"); if (!printFile) { Serial.println("无法打开consta.txt文件"); while(1); } // 逐行读取并处理键值对 while (printFile.available()) { buffer = printFile.readStringUntil('\n'); // 读取整行内容 buffer.trim(); // 移除首尾的换行、空格等空白字符 if (buffer.isEmpty()) continue; // 跳过空行 // 定位冒号位置,拆分键和值 int colonPos = buffer.indexOf(':'); if (colonPos == -1) continue; // 跳过无冒号的无效行 String key = buffer.substring(0, colonPos); key.trim(); // 清除键名前后的空格 String valueStr = buffer.substring(colonPos + 1); valueStr.trim(); // 清除数值前后的空格 // 根据键名赋值到对应变量 if (key == "SampleTime") { sampleTime = valueStr.toInt(); } else if (key == "SampleInterval") { sampleInterval = valueStr.toInt(); } else if (key == "Phone") { phone = valueStr; } } printFile.close(); // 操作完成后关闭文件 // 打印读取结果用于调试 Serial.println("读取到的参数:"); Serial.print("SampleTime: "); Serial.println(sampleTime); Serial.print("SampleInterval: "); Serial.println(sampleInterval); Serial.print("Phone: "); Serial.println(phone); } void loop() { // 主程序逻辑写在这里 }
关键步骤说明
- 逐行读取:用
readStringUntil('\n')读取完整一行,确保获取完整的键值对,避免只读到冒号就中断。 - 清除空白字符:调用
trim()处理键名和数值前后的空格、换行符,解决SampleInterval : 1000这种带空格的格式问题。 - 拆分键值:通过
indexOf(':')找到冒号位置,用substring()拆分出键和值字符串。 - 类型转换:整数类型的参数用
toInt()转换,字符串类型直接赋值。 - 关闭文件:操作完成后必须调用
close()释放SD卡资源,避免后续读写异常。
内容的提问来源于stack exchange,提问作者dachu darshan
相关产品推荐
相关产品推荐

