1、串口烧录基础:串口通信原理、波特率与数据位、常见烧录协议概览

大家好,欢迎来到《串口烧录与镜像校验技巧》实战课程。我是你们的老朋友,一个在嵌入式圈子里摸爬滚打了十几年的固件工程师。

咱们这门课,上来第一件事,就是要把串口烧录的底裤给扒干净。你可能会说:“串口?不就是 TX、RX 两根线吗?有啥好讲的?” 嗯,我当年也是这么想的。直到有一次,我在产线上调一个批量烧录的脚本,死活就是连不上芯片,折腾了整整一个下午。最后发现,是波特率设置差了那么一点点,加上一个不起眼的校验位没对上。从那以后,我再也不敢小看这些基础参数了。

所以,这一章咱们就稳扎稳打,把串口通信的根儿给扎牢了。后面讲协议、讲校验、讲各种骚操作,你才能心里有底。

1.1 串口通信:到底在聊什么?

串口通信,说白了就是两个设备之间,通过一根数据线,按位(bit)来传输数据。就像两个人打电话,一次只能说一个字,一个字一个字地往外蹦。它不像并口那样一次传一堆,但胜在简单、可靠、成本低。

我习惯把串口通信的核心要素总结为“三要素”:波特率、数据格式、流控。这三样东西,只要有一个对不上,通信就白搭。

核心要点:串口通信是异步的,没有单独的时钟线。收发双方必须提前约定好“说话的速度”和“说话的格式”,否则就是鸡同鸭讲。

咱们来看一个典型的串口数据帧长什么样。你想想看,一个字节(比如 0x55)从 TX 引脚飞出去,它其实不是光秃秃的 8 个 bit,而是被包装了一下:

  • 起始位: 先拉低电平,告诉对方“我要开始说话了”。固定为 1 位。
  • 数据位: 紧接着就是真正的数据,一般是 5 到 9 位。我们最常用的是 8 位。
  • 校验位: 可选。用来做简单的错误检查,比如奇校验或偶校验。
  • 停止位: 拉高电平,表示“我说完了”。一般是 1 位、1.5 位或 2 位。

这整个一包数据,就叫一帧。帧与帧之间,线路保持高电平(空闲状态)。

1.2 波特率与数据位:别小看这两个参数

咱们先聊波特率。波特率就是每秒传输的符号数。在串口通信里,一个符号就是一个 bit,所以波特率就等于比特率。单位是 bps(bits per second)。

常见的波特率有:9600、19200、38400、115200、921600 等等。我个人习惯,调试用 115200,因为速度够快,大部分 MCU 都支持。但如果是做低功耗或者长距离通信,我可能会降到 9600,因为波特率越低,抗干扰能力越强。

避坑指南: 我曾经在一个项目里,为了追求烧录速度,把波特率设到了 2Mbps。结果发现,只要线缆稍微长一点(超过 20cm),数据就开始出错。后来老老实实降回 921600,问题解决。记住,波特率不是越高越好,要看你的硬件环境。

再来说数据位。这个就简单了,它决定了每个数据帧里装多少个 bit 的真实数据。我们最常用的是 8 位数据位,因为一个字节正好是 8 位,方便处理。但有些老协议或者特殊场景,可能会用 7 位甚至 5 位。

这里有个小细节:数据位的发送顺序是低位在前(LSB first)。比如你要发送 0x55(二进制 01010101),先发出去的是最低位 1,然后是 0、1、0、1、0、1、0。这个顺序在你自己写底层驱动或者分析波形时,一定要记清楚。

我把常用的配置组合整理成了一个表,方便你查阅:

配置名称 波特率 数据位 校验位 停止位 典型场景
标准调试 115200 8 无 (N) 1 MCU 调试、日志输出
工业稳定 9600 8 偶校验 (E) 1 PLC、Modbus 通信
高速烧录 921600 8 无 (N) 1 串口 ISP 烧录
老旧设备 4800 7 奇校验 (O) 2 某些打印机、工控仪表

你看,不同的场景,配置完全不同。所以拿到一个新板子,第一件事就是去查它的 Bootloader 或者参考手册,确认它默认的串口参数是什么。

1.3 常见烧录协议概览:不只是发数据那么简单

好了,基础讲完了。咱们来看看,在烧录这个具体场景下,串口是怎么工作的。说白了,就是上位机(你的电脑)通过串口,把固件(.bin 或 .hex 文件)发给下位机(MCU),下位机再把它写到 Flash 里。

但这个过程不是简单的“发文件”。它需要一套协议来保证数据不出错、不丢包、不乱序。我接触过的烧录协议,主要有这么几类:

  • 厂商私有协议: 比如 ST 的 STM32 串口 ISP 协议、NXP 的 ISP 协议。这些协议是芯片厂商自己定义的,一般会包含握手、擦除、编程、校验、跳转等命令。优点是稳定、功能全;缺点是不通用,换个厂家的芯片,协议就得重学。
  • 标准协议: 比如 YMODEM、XMODEM。这些是通用的文件传输协议,很多 Bootloader 会支持。它们有固定的帧格式、CRC 校验和重传机制。我比较喜欢 YMODEM,因为它支持批量传输,效率高。
  • 自定义协议: 很多团队为了满足特定需求,会自己写一套简单的协议。比如只包含“地址 + 长度 + 数据 + 校验”的帧结构。优点是灵活、开销小;缺点是需要自己处理各种边界情况,容易有坑。

为了让你有个直观的感受,我画了一张图,把串口烧录的整个知识体系串起来:

串口烧录知识体系框架图 串口烧录知识体系 核心基础:串口通信三要素 波特率 通信速度的约定 数据格式 数据位/校验位/停止位 流控 硬件/软件流控 应用层:烧录协议 厂商私有协议 标准协议(YMODEM等) 自定义协议 核心思路:先搞定物理层(三要素),再理解应用层(协议),最后才是具体的烧录操作。

你看,整个知识体系是分层的。最底层是物理层,也就是我们刚讲的三要素。往上一层是数据链路层,负责把数据打包成帧。再往上才是应用层,也就是各种烧录协议。我建议你按照这个层次去理解,遇到问题也能快速定位是哪个环节出了岔子。

1.4 一个简单的烧录流程示例

光说不练假把式。咱们来看一个最简化的烧录流程,感受一下协议是怎么工作的。假设我们用的是 STM32 的串口 ISP 协议:

  1. 进入 ISP 模式: 拉高 BOOT0,拉低 BOOT1,然后复位芯片。芯片启动后,会运行内置的 Bootloader,等待串口命令。
  2. 握手: 上位机发送 0x7F,下位机回复 0x79(ACK)或 0x1F(NACK)。如果没收到回复,上位机会重试几次。
  3. 获取版本: 上位机发送命令 0x00(Get 命令),下位机回复 Bootloader 版本号和所支持的命令列表。
  4. 擦除: 上位机发送擦除命令(0x43)和要擦除的扇区号。下位机擦除完成后回复 ACK。
  5. 编程: 上位机发送写命令(0x31)、起始地址、数据长度和固件数据。每发完一包(通常是 256 字节),下位机就写入 Flash 并回复 ACK。
  6. 校验: 编程完成后,上位机可以发送读命令(0x11)把刚写进去的数据读回来,和原始数据做对比。这就是最基础的镜像校验。
  7. 跳转: 发送跳转命令(0x21)和应用程序的起始地址,下位机跳转到用户程序开始执行。

这个流程看起来简单,但每一步都有坑。比如握手阶段,如果波特率不对,你发 0x7F 过去,对方收到的可能是 0xFE 或者干脆收不到。再比如擦除阶段,有些芯片擦除时间很长,你需要等待足够的时间,否则发编程命令过去,它还在擦除,就会报错。

重要提醒: 在实际项目中,千万不要假设你的上位机发送的数据,下位机就一定能原封不动地收到。串口通信受环境影响很大,线缆质量、电磁干扰、电平不匹配,都可能导致数据出错。所以,一个健壮的烧录协议,必须有重传机制和校验机制。

好了,这一章的内容就到这里。我们搞清楚了串口通信的底层原理,知道了波特率、数据位这些参数到底在干什么,也了解了常见的烧录协议有哪些。这些知识就像盖房子的地基,地基不牢,后面盖再高的楼也是白搭。