2、串口通信基础:RS-232标准、波特率与数据位、奇偶校验与停止位、硬件握手

各位同学,咱们今天聊聊串口通信。说实话,这玩意儿虽然老,但直到现在,我在调试嵌入式设备、连接工业仪表时,还是离不开它。你想想看,一个从1960年代就开始用的协议,到现在还在发光发热,肯定有它的道理。

串口通信,说白了就是一根线发数据,一根线收数据,再加一根地线。简单、可靠、成本低。我刚开始做自动化那会儿,最怕的就是串口调不通,后来摸清了门道,才发现其实就那么几个关键参数。今天咱们一个一个掰开揉碎了讲。

2.1 RS-232标准:电压与电平的江湖

RS-232是串口通信的鼻祖标准。它定义了数据怎么在线上传输。我记得第一次用示波器看RS-232波形时,心里直犯嘀咕:这电压怎么是负的?

没错,RS-232的逻辑电平跟我们平时用的TTL(0V和3.3V/5V)完全相反:

  • 逻辑1(Mark):-3V 到 -15V
  • 逻辑0(Space):+3V 到 +15V

为什么要用负逻辑?其实是为了抗干扰。电压摆幅大,信号在长线传输时不容易被噪声淹没。我在一个工厂项目里,RS-232线拉了15米,用的就是±12V的电压,愣是没丢一个字节。

⚠️ 避坑指南:千万不要直接把RS-232信号接到单片机的TX/RX引脚上!我曾经见过一个新手,把-12V直接怼到3.3V的GPIO上,结果芯片当场冒烟。记住,RS-232和TTL之间必须用电平转换芯片,比如MAX232。

2.2 波特率:通信的节拍器

波特率,就是每秒传输多少个符号。对于串口来说,一个符号就是一个bit。所以9600波特率,就是每秒传9600个bit。

你可能会问:为什么常见的是9600、19200、115200这些数字?而不是10000、20000?

嗯,这里有个小历史。早期的晶振频率是1.8432MHz,这个频率除以16再除以某个数,刚好能得到9600。说白了,这些波特率是为了让时钟分频更精确。我个人习惯,低速场景用9600,高速场景用115200。再高的话,比如921600,对线缆和干扰就比较敏感了。

波特率 每字节传输时间(10位) 适用场景
9600 约1.04ms 调试、传感器、GPS
38400 约0.26ms 工业仪表、PLC
115200 约0.087ms 高速数据、固件升级
💡 个人经验:通信双方波特率必须一致,误差不能超过±2%。我遇到过最坑的一次,两边都设了9600,但有一边的晶振精度不够,实际跑了9650,结果每100个字节就错一个。后来换了高精度晶振才解决。

2.3 数据位与停止位:帧的骨架

串口传输数据,不是光秃秃地发bit。它要打包成一个「帧」。一个典型的帧长这样:

起始位(1bit) + 数据位(5~8bit) + 奇偶校验位(0/1bit) + 停止位(1/1.5/2bit)

数据位最常见的是8位,因为一个字节就是8位。但有些老设备用7位,比如某些ASCII终端。我建议你一律用8位,除非你明确知道对方只支持7位。

停止位,说白了就是给接收方一点时间消化数据。1位停止位最常用。2位停止位用在慢速设备或长线缆上,给信号多一点稳定时间。1.5位?我只在古董级的电传打字机上见过。

🔧 实战配置:我90%的项目都用 8数据位 + 1停止位 + 无校验。这个组合叫 8N1,是串口通信的「默认配置」。

2.4 奇偶校验:简单的错误检测

奇偶校验,就是给数据加一个额外的bit,让整个数据中1的个数是奇数(奇校验)或偶数(偶校验)。

举个例子:数据是 0b0100 0001(字符'A'),里面有2个1。

  • 偶校验:校验位设为0,保持1的总数为偶数(2个)。
  • 奇校验:校验位设为1,让1的总数变成奇数(3个)。

接收方收到后,数一下1的个数。如果不对,就知道数据出错了。

但说实话,奇偶校验只能检测奇数个bit的错误。如果两个bit同时翻转,它检测不出来。我在一个项目中用过奇校验,后来发现干扰导致连续两个bit出错,校验完全没反应。从那以后,我对奇偶校验的态度就是:聊胜于无。

⚠️ 注意:奇偶校验只能检测错误,不能纠正错误。如果发现错误,通常的做法是请求重发。如果你需要更强的纠错能力,建议用CRC或者更高级的协议。

2.5 硬件握手:让数据不丢包

硬件握手,也叫流控制。它用额外的两根线——RTS(请求发送)和CTS(允许发送)——来控制数据流。

工作原理很简单:

  1. 发送方想发数据,先把RTS拉高。
  2. 接收方准备好了,把CTS拉高。
  3. 发送方看到CTS为高,开始发数据。
  4. 如果接收方缓冲区满了,就把CTS拉低,发送方看到后立即停止发送。

我建议在以下场景一定要用硬件握手:

  • 高速通信(115200以上)
  • 接收方处理速度慢(比如单片机要处理大量计算)
  • 长距离传输(线缆超过10米)

有一次,我在调试一个高速数据采集系统,波特率设到460800。不用硬件握手时,每发几百个字节就丢一个。加上RTS/CTS后,稳如老狗。嗯,这就是硬件的魅力。

💡 小技巧:如果你不确定对方是否支持硬件握手,可以先试试软件流控制(XON/XOFF)。但软件流控制有个致命缺点:它用特殊字符(0x11和0x13)来控制,如果传输二进制数据,可能会跟数据冲突。所以,传二进制数据时,我强烈推荐硬件握手。

2.6 总结:串口配置的黄金法则

好了,咱们把串口通信的几个核心参数都过了一遍。最后,我给大家一个配置清单,照着做基本不会出错:

  • 波特率:首选115200,兼容性选9600
  • 数据位:一律8位
  • 停止位:1位
  • 奇偶校验:无(除非设备要求)
  • 硬件握手:高速或长距离时开启

串口通信,说白了就是发方和收方约定好一套规则。只要两边参数一致,线接对了,基本就能通。如果通不了,别慌,拿示波器看看波形,或者用串口助手抓一下数据,问题往往出在电平转换或者波特率误差上。

下一章,咱们聊聊RS-485,那个能传1200米的串口变种。到时候你会发现,RS-232只是开胃菜。