【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()
(固定长度读取)。
- 文本协议(如 AT 指令):
3. 接收二进制数据(如文件、图像)
- 场景:通过串口传输二进制文件(如固件升级、数据日志)。
- 推荐方法:
readBytes()
配合缓冲区,按固定包长读取并校验。
4. 实时数据采集(如串口传感器)
- 场景:持续接收传感器的实时数据(如温湿度、加速度)。
- 推荐方法:
read()
逐字节读取,或readStringUntil()
按分隔符解析(如逗号分隔的 CSV 数据)。
四、注意事项
- 缓冲区大小:Arduino 串口缓冲区默认大小为 64 字节,若数据量过大(如超过 64 字节),需分批次读取,避免数据丢失。
- 超时设置:对实时性要求高的场景(如传感器数据),可通过
setTimeout()
减小超时时间(如 100ms)。 - 软件串口限制:
SoftwareSerial
性能低于硬件串口,波特率过高(如 >115200)可能导致数据丢失,适合低速率通信。
通过选择合适的读取方法,可高效处理不同类型的串口数据,满足调试、传感器通信、设备控制等多种场景需求。