当前位置: 首页 > news >正文

【ARDUINIO】从串口读取数据的方法总结

ARDUINIO从串口读取数据的方法总结

      • 一、核心读取方法及特点
        • 1. `Serial.read()`
        • 2. `Serial.readString()`
        • 3. `Serial.readStringUntil(char terminator)`
        • 4. `Serial.readBytes(byte buffer[], size_t length)`
        • 5. `Serial.find(String target)`
      • 二、关键辅助函数
      • 三、典型使用场景
        • 1. 读取用户输入(如调试指令)
        • 2. 与传感器/模块通信(如 ESP8266、GPS)
        • 3. 接收二进制数据(如文件、图像)
        • 4. 实时数据采集(如串口传感器)
      • 四、注意事项

在 Arduino 中,读取串口数据的方法主要围绕硬件串口(Serial)和软件串口(SoftwareSerial)展开,不同方法适用于不同场景,以下是详细总结:

一、核心读取方法及特点

1. Serial.read()
  • 功能:读取串口缓冲区中的一个字节(返回值为 int 类型,范围 0-255,无数据时返回 -1)。
  • 特点:一次读一个字节,需手动处理多字节数据拼接。
  • 示例
    if (Serial.available() > 0) {int data = Serial.read();  // 读取一个字节Serial.print("收到字节:");Serial.println(data);
    }
    
2. Serial.readString()
  • 功能:读取串口缓冲区中的所有可用数据,直到超时(默认超时时间 1000ms,可通过 Serial.setTimeout() 修改)。
  • 特点:自动拼接为字符串,适合读取连续的文本数据(如 JSON、命令字符串)。
  • 示例
    if (Serial.available() > 0) {String str = Serial.readString();  // 读取所有数据为字符串Serial.print("收到字符串:");Serial.println(str);
    }
    
3. Serial.readStringUntil(char terminator)
  • 功能:读取数据直到遇到指定的终止符(如 '\n'','),返回包含终止符之前的字符串(不含终止符)。
  • 特点:适合读取结构化数据(如一行文本、以特定符号分隔的指令)。
  • 示例
    if (Serial.available() > 0) {String line = Serial.readStringUntil('\n');  // 读取一行数据(以换行结束)Serial.print("收到一行:");Serial.println(line);
    }
    
4. Serial.readBytes(byte buffer[], size_t length)
  • 功能:读取指定长度(length)的字节到缓冲区(buffer),返回实际读取的字节数。
  • 特点:适合读取二进制数据(如传感器的二进制协议、固定长度的数据包)。
  • 示例
    byte buffer[10];  // 定义缓冲区
    if (Serial.available() >= 10) {int len = Serial.readBytes(buffer, 10);  // 读取10字节Serial.print("收到字节数:");Serial.println(len);
    }
    
5. Serial.find(String target)
  • 功能:从串口缓冲区中搜索指定字符串target),找到则返回 true,超时返回 false
  • 特点:无需手动处理数据拼接,适合检测特定命令(如“ON”“OFF”)。
  • 示例
    if (Serial.find("START")) {  // 搜索"START"字符串Serial.println("检测到启动命令");
    }
    

二、关键辅助函数

  • Serial.available():返回串口缓冲区中待读取的字节数,用于判断是否有数据可读取(避免读取空数据)。
  • Serial.setTimeout(unsigned long timeout):设置 readString()readStringUntil()find() 等函数的超时时间(默认 1000ms)。
  • Serial.flush():清空串口发送缓冲区(等待所有数据发送完成),注意:不用于清空接收缓冲区(接收缓冲区需通过读取数据清空)。

三、典型使用场景

1. 读取用户输入(如调试指令)
  • 场景:通过串口监视器发送命令(如“LED_ON”“SET_100”),控制 Arduino 执行操作。
  • 推荐方法:readStringUntil('\n')(按行读取指令)或 find()(检测特定命令)。
2. 与传感器/模块通信(如 ESP8266、GPS)
  • 场景:通过串口接收模块返回的结构化数据(如 GPS 的 NMEA 语句、ESP8266 的 AT 指令响应)。
  • 推荐方法:
    • 文本协议(如 AT 指令):readStringUntil('\n')(按行解析)。
    • 二进制协议(如工业传感器):readBytes()(固定长度读取)。
3. 接收二进制数据(如文件、图像)
  • 场景:通过串口传输二进制文件(如固件升级、数据日志)。
  • 推荐方法:readBytes() 配合缓冲区,按固定包长读取并校验。
4. 实时数据采集(如串口传感器)
  • 场景:持续接收传感器的实时数据(如温湿度、加速度)。
  • 推荐方法:read() 逐字节读取,或 readStringUntil() 按分隔符解析(如逗号分隔的 CSV 数据)。

四、注意事项

  1. 缓冲区大小:Arduino 串口缓冲区默认大小为 64 字节,若数据量过大(如超过 64 字节),需分批次读取,避免数据丢失。
  2. 超时设置:对实时性要求高的场景(如传感器数据),可通过 setTimeout() 减小超时时间(如 100ms)。
  3. 软件串口限制SoftwareSerial 性能低于硬件串口,波特率过高(如 >115200)可能导致数据丢失,适合低速率通信。

通过选择合适的读取方法,可高效处理不同类型的串口数据,满足调试、传感器通信、设备控制等多种场景需求。


文章转载自:

http://D6pdvzAX.fkmrj.cn
http://NUb09kbq.fkmrj.cn
http://5WtGqDwB.fkmrj.cn
http://NWMiahpd.fkmrj.cn
http://nKu334GJ.fkmrj.cn
http://979tzmzY.fkmrj.cn
http://ufQ8xafT.fkmrj.cn
http://bIcfxiaA.fkmrj.cn
http://1MMURikj.fkmrj.cn
http://mpPY1CIL.fkmrj.cn
http://ZwKMgSp2.fkmrj.cn
http://WP9mJOWy.fkmrj.cn
http://omWzowbT.fkmrj.cn
http://2HE72YrL.fkmrj.cn
http://hcddSi2j.fkmrj.cn
http://4yJxDYsP.fkmrj.cn
http://YaaginIT.fkmrj.cn
http://gFlPfKVJ.fkmrj.cn
http://ZSY77SeR.fkmrj.cn
http://XXwiUAzN.fkmrj.cn
http://jQwcezEN.fkmrj.cn
http://sgtwxWiY.fkmrj.cn
http://p597sBgh.fkmrj.cn
http://XgmjRX0M.fkmrj.cn
http://H59px7gq.fkmrj.cn
http://ijSAimWS.fkmrj.cn
http://2h2fK7fa.fkmrj.cn
http://arvYHp2e.fkmrj.cn
http://llW2obIl.fkmrj.cn
http://8E3VbLvM.fkmrj.cn
http://www.dtcms.com/a/380543.html

相关文章:

  • Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置
  • 如何使用 Linux ping 命令 ?
  • 分布式专题——10.3 ShardingSphere实现原理以及内核解析
  • 神经网络稀疏化设计构架方法和原理深度解析
  • 10-SpringBoot入门案例(下)
  • ⽹络请求Axios的概念和作用
  • 缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(三)
  • 认知语义学对人工智能自然语言处理的深层语义分析:理论启示与实践路径
  • 快速搭建B/S架构HTML演示页:从工具选择到实战落地
  • Git 简介
  • Java 中 Word 文档的加密与解密
  • SAM-Med3D:面向三维医疗体数据的通用分割模型 (代码仓库笔记)
  • 嵌入式桌面集成 · GNOME 与 Yocto 在 Jetson AGX Orin 上的实战指南
  • Model Context Protocol (MCP) 安全风险与攻击方式解析
  • 计算机毕业设计 基于大数据技术的医疗数据分析与研究 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 单片机烧录原理是怎样的?辉芒微单片机烧录程序步骤教程如下
  • CI/CD流水线优化实战:从30分钟到5分钟的效能革命
  • 融智学:构建AI时代学术的新范式
  • 自指与递归既是威力也是边界(会带来不可判定与不完备)
  • HarmonyOS 实战:如何用数据压缩和解压让应用更快更省
  • 软考-系统架构设计师 信息安全的抗攻击技术详细讲解
  • Spring Initializr(或者 IDEA 里新建 Spring Boot 项目)时 Dependencies 的选择
  • 创建一个Spring Boot Starter风格的Basic认证SDK
  • 数据库的连接_qt
  • Tessent_ijtag_ug——第 4 章 ICL 提取(1)
  • Qt开发经验 --- Qt 修改控件样式的方式(16)
  • UE5 基础应用 —— 07 - 角色蓝图 简单使用
  • Motioncam Color S + 蓝激光:3D 视觉革新,重塑工业与科研应用新格局
  • arduino编程esp8266模块并烧写联网详细教程【单片机联网】
  • 云蝠智能大模型呼叫——AI不仅能“听懂话”,更能“读懂心”