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后稳如老狗。
1.2 波特率:通信的“语速”
波特率就是每秒传输的符号数。单位是bps(bits per second)。常见的值有:9600、19200、38400、115200。
为什么是这些“奇怪”的数字?因为晶振分频出来的。115200 = 1152000 / 10,刚好是很多MCU主频的整数分频。你设个100000试试?很多芯片根本配不出来。
我曾经踩过一个坑:两个设备波特率都设成了“9600”,但一个用的是16MHz晶振,另一个是12MHz。结果误差累积,每传几十个字节就错一个。后来用示波器一看,实际波特率差了3%。
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.7 串口通信知识体系
下面这张图把串口通信的核心要素串起来了。你一看就明白:物理层、帧结构、配置参数,三者缺一不可。
1.8 实战中的配置清单
每次调试串口,我都会按这个清单检查一遍。你照着做,能省下不少排查时间:
- 物理层确认:RS232还是RS485?电平转换芯片对不对?TX/RX有没有接反?
- 波特率核对:双方设置是否一致?晶振精度够不够?误差在不在范围内?
- 帧格式对齐:数据位、停止位、校验位,两边必须一模一样。
- 硬件流控:RTS/CTS用不用?如果不用,相关引脚要处理好。
- 示波器验证:看波形,确认起始位、数据位、停止位的时序对不对。
串口通信看起来简单,但细节决定成败。你把这一章吃透了,后面调试I2C、SPI的时候,很多思路是相通的。嗯,咱们先把基础打扎实。