第 3 讲 · 串口通信与消息边界
串口传的是字节流
Serial.begin(9600);
9600 表示每秒传输约 9600 个符号位。发送端、接收端和串口监视器必须使用一样的通信参数,否则接收到的会是乱码。
if (Serial.available() > 0) {
const char value = Serial.read();
Serial.println(value);
}
available() 是当前缓冲区字节数,不是一条消息的完整长度。
为什么“把当前所有字节读完”不等于“收到一句话”
源代码用 while (Serial.available() > 0) 把当前到达的字节追加到 String。但串口数据可能分批到达:第一轮循环读到 hel,下一轮才读到 lo。
要定义消息边界,可约定换行符:
const String line = Serial.readStringUntil('\n');
更稳健的嵌入式实现会用固定长度字符缓冲区,避免频繁拼接 String 造成堆碎片。
一个最小文本协议
超声波雷达的 Processing 程序期待:
90,27.
它表示角度 、距离 ,句点是帧结束符,逗号分隔两个字段。接收端的解析流程是:
- 一直读到
.; - 查找
,的位置; - 分别截取角度字符串和距离字符串;
- 转换成整数;
- 检查角度和距离是否在允许范围。
串口调试时先查什么
- 波特率是否一致;
- 选择的串口是否正确;
- 是否共地;
- 发送端是否真的加了结束符;
- 数值与文本的转换是否失败;
- 界面程序中的端口名是否被写死(源 Processing 代码使用
COM4)。