第 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.

它表示角度 90∘90^\circ、距离 27 cm27\ \mathrm{cm},句点是帧结束符,逗号分隔两个字段。接收端的解析流程是:

  1. 一直读到 .;
  2. 查找 , 的位置;
  3. 分别截取角度字符串和距离字符串;
  4. 转换成整数;
  5. 检查角度和距离是否在允许范围。

串口调试时先查什么

  • 波特率是否一致;
  • 选择的串口是否正确;
  • 是否共地;
  • 发送端是否真的加了结束符;
  • 数值与文本的转换是否失败;
  • 界面程序中的端口名是否被写死(源 Processing 代码使用 COM4)。

评论