Arduino环境下不使用getline()/fgets/scanf从接收缓冲区读取整行的方法
Arduino下不使用getline/fgets/scanf读取LoRa完整行数据的解决方案
核心思路
Arduino环境中,LoRa模块的读取接口仅支持单字符读取,我们可以手动实现行读取逻辑:逐个读取缓冲区字符,存入自定义数组,直到检测到行结束符(\n或\r),最后给数组添加字符串结束符,即可得到完整一行数据。
实现代码示例
#define BUFFER_SIZE 64 // 根据实际传输的数据长度调整缓冲区大小 char receivedLine[BUFFER_SIZE]; int lineIndex = 0; void loop() { if (LoRa.available() > 0) { // 读取新行前重置缓冲区索引与内容 lineIndex = 0; memset(receivedLine, 0, BUFFER_SIZE); while (LoRa.available() > 0) { char currentChar = (char)LoRa.read(); // 识别行结束符,兼容\n、\r、\r\n三种格式 if (currentChar == '\n' || currentChar == '\r') { // 处理\r\n组合场景,跳过后续的换行符 if (currentChar == '\r' && LoRa.peek() == '\n') { LoRa.read(); } receivedLine[lineIndex] = '\0'; // 添加字符串结束标记 break; // 完成整行读取,退出循环 } else { // 避免缓冲区溢出,预留1个字节给结束符 if (lineIndex < BUFFER_SIZE - 1) { receivedLine[lineIndex++] = currentChar; } // 缓冲区已满时可添加自定义逻辑,比如标记溢出、丢弃后续字符 } } // 处理读取到的完整行数据 if (lineIndex > 0) { Serial.println(receivedLine); // 串口打印验证 // 在此添加你的业务逻辑,如数据解析、存储等 } } }
关键注意事项
- 缓冲区适配:根据实际传输的单行数据长度修改
BUFFER_SIZE,确保预留1个字节给字符串结束符\0。 - 结束符兼容:不同设备的行结束符可能是
\n、\r或\r\n,代码已覆盖这三种常见格式。 - 溢出防护:如果缓冲区满了仍未检测到行结束符,代码会自动截断后续字符,可根据需求添加溢出提示或扩容逻辑。
- 状态重置:每次读取新行前必须重置索引并清空缓冲区,避免残留上一行数据。
内容的提问来源于stack exchange,提问作者martinm96
相关产品推荐
相关产品推荐

