1. 串口通信基础:RS232标准、TTL电平、波特率、数据帧格式、串口通信原理
串口通信,说白了就是让两个设备通过一根线,一位一位地传数据。听起来简单,但里面的门道不少。我刚开始做嵌入式时,觉得串口不就是TX、RX两根线嘛,结果第一次调板子,数据全是乱码,折腾了一下午才发现是电平没匹配。嗯,咱们就从最基础的说起。
1.1 什么是串口通信?
串口通信,全称串行通信接口。它一次只传1位数据,跟并行通信(一次传8位、16位)正好相反。你想想看,并行虽然快,但线多、成本高、抗干扰差。串口就两根线,简单可靠,调试时特别好用。
我个人习惯,每块新板子到手,第一件事就是把串口焊出来。为什么?因为串口是嵌入式工程师的「眼睛」——程序跑没跑、数据对不对,全靠它看。
核心特点:
- 异步通信:不需要时钟线,双方约定好速度就行
- 全双工:TX和RX独立,可以同时收发
- 点对点:一般就两个设备之间通信
1.2 RS232标准 vs TTL电平
这是新手最容易踩坑的地方。RS232和TTL,虽然都叫串口,但电平标准完全不同。
| 参数 | RS232标准 | TTL电平 |
|---|---|---|
| 逻辑1(高电平) | -3V ~ -15V | 2.0V ~ 5.5V |
| 逻辑0(低电平) | +3V ~ +15V | 0V ~ 0.8V |
| 电压摆幅 | 大(约±12V) | 小(0~3.3V或5V) |
| 传输距离 | 可达15米以上 | 一般1~2米 |
| 常见接口 | DB9(9针串口) | 排针、杜邦线 |
我在项目中遇到过一件事:客户拿了个RS232的设备,直接往我们板子的TTL串口上怼,结果烧了IO口。后来才知道,RS232的±12V对3.3V的芯片来说就是「高压电」。所以,一定要用电平转换芯片,比如MAX232、SP3232这类。
警告:千万不要把RS232直接接到MCU的串口引脚上!必须先经过电平转换。我曾经见过有人用分压电阻硬扛,结果信号畸变严重,数据全是错的。
1.3 波特率
波特率,就是每秒传多少位。单位是bps(bits per second)。常见的波特率有:9600、19200、38400、115200。
为什么要有这么多?因为速度越快,对时钟精度要求越高。9600是「万金油」,几乎所有设备都支持。115200是调试时的首选,快,省时间。
我个人的习惯:调试阶段用115200,量产固件用9600。为什么?因为115200对晶振误差容忍度低,如果板子用的陶瓷谐振器(精度±0.5%),跑115200可能丢数据。9600就稳得多。
小技巧:计算一位数据的时间:1 / 波特率。比如9600,一位就是104μs。这个数字在逻辑分析仪上抓波形时特别有用,一眼就能看出波特率设没设对。
1.4 数据帧格式
串口传数据,不是光传数据位就完事了。它有一套固定的「帧格式」,就像寄快递要有包装一样。
一个完整的数据帧包含:
- 起始位(1位):永远是低电平。告诉接收方「我要开始传了」。
- 数据位(5~9位):一般是8位。就是你要传的字节。
- 校验位(可选,0或1位):奇校验、偶校验、或无校验。
- 停止位(1位、1.5位或2位):永远是高电平。告诉接收方「这一帧结束了」。
最常见的配置是:8N1 —— 8位数据、无校验、1位停止位。你想想看,几乎90%的串口设备都用这个配置。
数据帧示例(8N1,发送0x55):
起始位: 0
数据位: 01010101 (LSB first,先传低位)
停止位: 1
波形:0 01010101 1
↑ 起始位 ↑ 停止位
为什么0x55(二进制01010101)是测试串口的经典数据?因为它的波形是0101交替,用示波器一看就知道每位宽度对不对,波特率准不准。
1.5 串口通信原理
串口通信的核心,就是「异步收发」。没有时钟线,全靠双方约定好的波特率来同步。
发送方:把并行数据(比如一个字节)转成串行,一位一位地从TX脚发出去。
接收方:在RX脚上采样,根据波特率把每一位收回来,再拼成一个字节。
这里有个关键点:接收方怎么知道什么时候开始采样?靠起始位。当RX脚从高电平跳变到低电平,接收方就知道「来了」,然后按波特率一位一位地读。
我刚开始学的时候,总觉得异步通信不靠谱——没有时钟,两边怎么对齐?后来用逻辑分析仪抓了一次波形,才恍然大悟。原来接收方内部有一个16倍或8倍波特率的采样时钟,在每位数据的中间采样,这样即使两边时钟有微小误差,也能正确读到数据。
避坑指南:我曾经遇到过一个问题:两个板子用串口通信,波特率都设成115200,但数据就是乱码。查了半天,发现一个板子的晶振是11.0592MHz,另一个是12MHz。11.0592MHz能精确分频出115200,12MHz分出来是115200.xx,有误差。虽然误差在允许范围内,但连续传长数据包时,误差累积,就丢位了。后来我把两个板子都换成11.0592MHz晶振,问题解决。
1.6 知识体系总览
下面这张图,把串口通信的核心知识点串起来了。你可以把它当作本章的「地图」。
这张图把串口通信拆成了四个维度:电平标准、波特率、数据帧格式、通信原理。你调试时遇到问题,按这四个方向排查,基本都能找到原因。
1.7 本章小结
串口通信基础,说白了就三件事:电平要对、波特率要准、帧格式要一致。这三样对了,数据就能通。我见过太多新手,上来就调代码,结果发现是RS232和TTL没分清,或者波特率设错了。嗯,基础打牢,后面烧录、调试才能顺风顺水。