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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:41:03