1. 串口通信基础:RS232/RS485标准、波特率、数据位、停止位、校验位详解

串口通信,说白了就是设备之间最传统、最直接的“对话”方式。我做了十几年嵌入式,调试过的串口问题少说也有上百个。很多新手一上来就追着I2C、SPI跑,结果连最基础的串口配置都搞不定。嗯,咱们先把地基打牢。

核心认知:串口通信是异步的,没有时钟线。收发双方全靠约定好的“语速”和“数据格式”来对齐。一旦对不上,收到的就是乱码。

1.1 RS232 vs RS485:物理层的“脾气”不一样

RS232和RS485,虽然都叫串口,但电气特性完全不同。我见过有人拿RS232的线去接RS485的设备,结果烧了接口芯片——这就是没搞清楚它们的区别。

特性 RS232 RS485
信号方式 单端(对地) 差分(A/B线)
电压范围 ±3V ~ ±15V ±1.5V ~ ±6V(差分)
最大距离 约15米 约1200米
最大节点数 1对1 1对32(甚至更多)
常用场景 调试口、短距设备 工业总线、多机通信

RS232 是点对点的。你想想看,电脑的DB9串口就是RS232。它的信号是相对于地线的,所以容易受干扰。我在调试一个老款PLC时,线拉长了10米,数据就开始丢包——这就是RS232的物理极限。

RS485 用的是差分信号,两根线(A和B)互相参考。干扰来了,两根线上一起变,差值不变。所以抗干扰能力强,距离也远。我记得有个项目,厂房里电机一启动,RS232就乱码,换成RS485后稳如老狗。

我的习惯:调试口用RS232,简单直接。工业现场或长距离,一律上RS485。别在RS232上硬扛距离,那是跟自己过不去。

1.2 波特率:通信的“语速”

波特率就是每秒传输的符号数。单位是bps(bits per second)。常见的值有:9600、19200、38400、115200。

为什么是这些“奇怪”的数字?因为晶振分频出来的。115200 = 1152000 / 10,刚好是很多MCU主频的整数分频。你设个100000试试?很多芯片根本配不出来。

我曾经踩过一个坑:两个设备波特率都设成了“9600”,但一个用的是16MHz晶振,另一个是12MHz。结果误差累积,每传几十个字节就错一个。后来用示波器一看,实际波特率差了3%。

避坑指南:波特率误差超过±2%,长数据包就会出错。尤其是115200以上,晶振精度和分频误差都要算清楚。我曾经因为用了内部RC振荡器,115200下死活连不上——换成外部晶振就好了。

1.3 数据位:一帧里装多少“干货”

数据位就是每个字节实际传输的位数。通常是7位或8位。

  • 7位数据位:老协议用的多,比如Modbus ASCII模式。只能传0-127的字符。
  • 8位数据位:现在的主流。一个字节8位,0-255都能传。

你可能会问:为什么还有7位?因为早期电传打字机只传ASCII字符,7位就够了。现在嘛,除非你对接古董设备,否则一律用8位。我调试过一个20年前的温控器,它只认7位数据位+偶校验——折腾了我一下午。

1.4 停止位:帧与帧之间的“喘息”

停止位是每个字节传输结束后的空闲时间。常见的有1位、1.5位、2位。

  • 1位停止位:效率最高,最常用。
  • 2位停止位:给接收端更多时间处理。老设备或低速场景用。
  • 1.5位停止位:很少见,某些特殊芯片才用。

我个人习惯:除非设备手册明确要求,否则一律用1位停止位。2位停止位会让有效传输率下降约10%,没必要。

1.5 校验位:数据对不对?

校验位是用来检测传输错误的。常见三种:无校验、奇校验、偶校验。

校验方式 原理 特点
无校验 (None) 不添加校验位 效率最高,无检错能力
奇校验 (Odd) 数据位+校验位中1的个数为奇数 能检测奇数位错误
偶校验 (Even) 数据位+校验位中1的个数为偶数 能检测奇数位错误

校验位只能检测奇数个比特的错误。如果两个比特同时翻转,校验位是看不出来的。所以工业现场更常用CRC校验,那是另一回事了。

我记得有一次,设备间通信偶尔出错,查了半天发现是校验位设置不一致:发送端设了偶校验,接收端设了无校验。结果接收端把校验位当数据位读了,每个字节都错位。

我的建议:调试阶段先用无校验,把基本通路打通。确认无误后再加上校验。否则校验出错时,你分不清是线路问题还是校验配置问题。

1.6 串口帧结构:一帧长什么样?

把上面这些拼起来,就是一帧完整的串口数据。咱们以最常见的8N1(8数据位、无校验、1停止位)为例:

起始位(1bit) + 数据位(8bits) + 停止位(1bit) = 10bits/字节

所以,115200波特率下,每秒实际传输的字节数不是115200/8=14400,而是115200/10=11520字节。这个换算很多新手会算错。

关键公式:实际字节速率 = 波特率 / (1 + 数据位数 + 校验位数 + 停止位数)

1.7 串口通信知识体系

下面这张图把串口通信的核心要素串起来了。你一看就明白:物理层、帧结构、配置参数,三者缺一不可。

串口通信知识体系 串口通信 物理层标准 帧结构 配置参数 RS232 RS485 起始位 停止位 波特率 校验位 单端信号 ±3V~±15V 差分信号 多节点、远距离 1 bit 低电平 1/1.5/2 bit 高电平 9600/115200 误差<2% None/Odd/Even 检错能力有限 收发双方:物理层一致 + 帧结构一致 + 配置参数一致 才能正常通信 图:串口通信三大要素——物理层、帧结构、配置参数

1.8 实战中的配置清单

每次调试串口,我都会按这个清单检查一遍。你照着做,能省下不少排查时间:

  1. 物理层确认:RS232还是RS485?电平转换芯片对不对?TX/RX有没有接反?
  2. 波特率核对:双方设置是否一致?晶振精度够不够?误差在不在范围内?
  3. 帧格式对齐:数据位、停止位、校验位,两边必须一模一样。
  4. 硬件流控:RTS/CTS用不用?如果不用,相关引脚要处理好。
  5. 示波器验证:看波形,确认起始位、数据位、停止位的时序对不对。
血的教训:我曾经在调试一个485总线项目时,A/B线接反了。结果数据能发出去,但收不到回复。查了整整两天,最后发现是线序问题。从那以后,我每次接线都会用万用表量一下A/B的电压极性。

串口通信看起来简单,但细节决定成败。你把这一章吃透了,后面调试I2C、SPI的时候,很多思路是相通的。嗯,咱们先把基础打扎实。