2、串口通信基础:串行与并行通信区别、异步与同步传输、波特率、数据位、停止位、校验位
串口通信(UART,Universal Asynchronous Receiver/Transmitter)是嵌入式系统、工业控制、仪器仪表和物联网设备中最基础也最常用的通信方式之一。RS232与RS422作为串口通信的物理层标准,其上层的数据传输机制完全遵循本节所讲述的串行通信基础规则。理解串行与并行的本质区别、异步与同步的时序差异、以及波特率、数据位、停止位、校验位这五个核心参数的配置逻辑,是后续掌握RS232/RS422电气特性、接线方式和排障技巧的基石。本节将从概念原理、参数配置、实战案例和常见误区四个维度,系统拆解串口通信的底层逻辑。
2.1 串行与并行通信:本质区别与适用场景
核心原理:从“多车道”到“单车道”的取舍
并行通信(Parallel Communication)是指将数据的多个比特位(bit)通过多根并行的数据线同时传输。例如,8位并行通信需要8根数据线,加上时钟线、控制线,一个完整的并行接口往往需要20根以上的信号线。并行通信的优点是传输速率高(单位时间内可传输完整字节),在短距离(通常小于2米)场景下(如CPU与内存之间的总线、打印机并口)具有明显优势。但其致命缺陷在于:随着速率提升,多根线之间的信号偏移(Skew)和串扰(Crosstalk)会急剧恶化,且线缆成本高、占用宝贵的IO资源。
串行通信(Serial Communication)则是在一根数据线上逐位发送数据,如同单车道行驶。虽然“单车道”看似效率低,但通过提高时钟频率,串行通信的速率可以远超并行通信。例如,PCIe 4.0单通道速率可达16GT/s,而传统并行ATA(PATA)最高仅为133MB/s。串行通信的核心优势在于:布线简单(最少仅需TX、RX、GND三根线)、抗干扰能力强(差分信号可进一步抑制共模噪声)、传输距离远(RS232可达15米,RS422可达1200米)。对于RS232/RS422这类工业串口标准,串行传输是唯一选择。
判断方法:如何选择串行还是并行
- 传输距离:距离超过1米,优先选择串行;距离在厘米级且速率要求极高(如DDR内存),选择并行。
- IO资源:MCU引脚有限,串行通信(UART/SPI/I2C)可大幅节省引脚。
- 成本与可靠性:并行线缆昂贵且易受电磁干扰,工业环境首选串行。
- 速率需求:若单字节传输时间要求低于微秒级,且距离很近,并行仍有一席之地;否则串行+高速时钟是更优解。
案例拆解:打印机并口 vs 工业PLC串口
早期计算机的LPT并口(DB25)传输打印机数据,采用8位并行方式,理论速率可达2MB/s,但线缆长度限制在2米以内,且必须使用屏蔽线。而现代工业PLC(可编程逻辑控制器)与触摸屏通信,普遍采用RS232或RS422串口,虽然速率仅为9.6kbps~115.2kbps,但可以在长达数百米的距离上稳定传输,且仅需双绞线或屏蔽线。这个对比清晰地说明:并行追求“短距离极致速率”,串行追求“长距离可靠传输”。在RS232/RS422的应用场景中,串行是唯一合理的选择。
常见误区与总结
误区2:忽略串行通信的“帧开销”。串行传输每个字节需要附加起始位、停止位(可能还有校验位),实际有效数据率约为标称波特率的80%(8/10)。
误区3:在长距离并行传输中未考虑信号偏移,导致数据错位。并行通信超过1米时,必须使用LVDS等差分并行技术,成本极高。
2.2 异步传输与同步传输:时序同步的两种哲学
核心原理:有无共享时钟的区别
异步传输(Asynchronous Transmission)是UART串口通信的基础模式。在异步传输中,发送端和接收端不共享时钟信号,双方各自使用自己的时钟源(通常是晶振或PLL)。为了确保接收端能在正确的时刻采样数据,异步协议规定:线路空闲时保持高电平(逻辑1),当发送数据时,先发送一个低电平的起始位(逻辑0),通知接收端“数据即将开始”。接收端检测到起始位的下降沿后,按照约定的波特率(即位周期)在每一位的中心点进行采样。由于每个字节的帧都有起始位和停止位作为边界,即使双方时钟存在微小偏差(通常允许±2%~±5%),也能在单个字节内保持同步。
同步传输(Synchronous Transmission)则要求发送端和接收端共享同一个时钟信号。这个时钟可以是一条独立的时钟线(如I2C的SCL),也可以是从数据信号中恢复的嵌入式时钟(如SPI的SCLK)。同步传输不需要起始位和停止位,数据连续发送,效率更高,但代价是需要额外的时钟线或复杂的时钟恢复电路。RS232和RS422标准仅支持异步传输,因此本节重点讨论异步机制。
操作流程:异步传输的时序解析
- 空闲状态:TX线保持高电平(逻辑1)。
- 发送起始位:TX线拉低一个位周期(T_bit = 1/波特率),接收端检测到下降沿。
- 发送数据位:按照约定的数据位长度(通常为8位),从LSB(最低有效位)开始逐位发送,每位持续一个T_bit。
- 发送校验位(可选):根据校验算法(偶校验/奇校验)计算校验值并发送。
- 发送停止位:TX线拉高至少1个位周期(1/1.5/2位),表示一帧结束。
- 接收端采样:接收端在起始位下降沿后,延迟半个位周期(T_bit/2)采样第一个数据位,之后每隔T_bit采样一次,确保采样点位于位中心。
案例拆解:MCU与GPS模块的异步通信
某STM32F103微控制器通过UART2接口连接GPS模块(如NEO-6M),配置为9600bps,8位数据,无校验,1位停止位(8N1)。GPS模块每秒输出一次NMEA 0183格式的GPRMC语句,约80个字符。MCU在空闲状态时,RX引脚为高电平。当GPS模块发送第一个字符'$'(ASCII码0x24,二进制00100100)时,TX线先拉低1位(起始位),然后依次发送0、0、1、0、0、1、0、0(LSB在前),最后拉高1位(停止位)。MCU的UART外设硬件自动完成采样和移位,无需CPU干预。若MCU的时钟误差超过±3%,则可能在第8位采样时发生错误,导致接收数据乱码。因此,异步通信对波特率精度有严格要求,通常要求双方时钟误差小于±2%。
常见误区与总结
2.3 波特率:通信速率的标尺
核心原理:比特率与波特率的辨析
波特率(Baud Rate)是指每秒传输的符号(Symbol)数量,单位是Baud(波特)。在UART串口通信中,每个符号仅代表1个比特(因为采用NRZ编码,高电平=1,低电平=0),因此波特率 = 比特率(bps)。例如,9600波特率意味着每秒传输9600个比特,每位时长约为104.2微秒。需要注意的是,在更复杂的调制技术(如QAM)中,一个符号可携带多个比特,此时波特率不等于比特率。但在RS232/RS422的基带传输中,两者等价。
标准波特率值包括:300、600、1200、2400、4800、9600、19200、38400、57600、115200、230400等。其中,9600和115200是最常用的两个档位。波特率越高,每位时间越短,对线路质量、线缆长度和双方时钟精度的要求也越高。
判断方法:如何选择合适的波特率
| 波特率 | 每位时长 | 典型应用场景 | 最大可靠距离(RS232) |
|---|---|---|---|
| 9600 | 104.2 μs | PLC配置、GPS模块、工业仪表 | 15米 |
| 19200 | 52.1 μs | 医疗设备、银行终端 | 10米 |
| 57600 | 17.4 μs | 高速数据采集、调试输出 | 5米 |
| 115200 | 8.7 μs | Bootloader烧录、WiFi模块AT指令 | 2-3米 |
选择原则:在满足应用吞吐量需求的前提下,尽量选择较低的波特率。例如,若设备每秒仅需上报10个字节(每个字节10位,含起始/停止位),则9600bps(约960字节/秒)已绰绰有余。盲目提高波特率会增加误码率,尤其是在长线缆或强电磁干扰环境中。
案例拆解:波特率不匹配导致的乱码问题
某工程师调试RS232通信,将PC端串口助手设置为115200bps,而目标设备(一个温湿度传感器)实际固件配置为9600bps。PC发送读取指令后,收到的数据为“ÿÿÿÿ”或随机乱码。分析过程:PC以115200bps采样,每位采样窗口为8.7μs,而传感器发送的每位实际为104.2μs,PC在一个数据位内会采样约12次,导致同一比特被误判为多个比特,数据完全错乱。解决方法是:通过示波器测量传感器TX引脚的波形,测量单个位的时间宽度,反推实际波特率。测量发现位宽约104μs,确认波特率为9600,修改PC配置后通信恢复正常。
常见误区与总结
2.4 数据位、停止位与校验位:帧结构的细节
核心原理:帧格式的完整定义
一个完整的UART异步帧由以下部分组成:起始位(1位,固定为0)、数据位(5~8位,常用8位)、校验位(0或1位,可选)、停止位(1/1.5/2位,固定为1)。数据位通常采用LSB First(最低有效位先行)的发送顺序。例如,发送十六进制0x55(二进制01010101),实际发送顺序为:1、0、1、0、1、0、1、0(从D0到D7)。
停止位的作用是保证两帧之间有一个明确的高电平间隔,为接收端提供重新同步的时间。停止位可以是1位、1.5位或2位。1.5位仅用于某些老式设备,现代设备几乎不使用。停止位越长,帧间隔越大,但传输效率越低。
校验位用于检测传输过程中的单比特错误。常见模式包括:
- 无校验(None):不发送校验位,帧长度为10位(起始1+数据8+停止1)。
- 偶校验(Even):保证数据位+校验位中“1”的个数为偶数。例如数据位为0x55(4个1),则校验位为0。
- 奇校验(Odd):保证“1”的个数为奇数。例如数据位为0x55(4个1),则校验位为1。
操作流程:校验位的计算与验证
// 以C语言计算偶校验位示例
uint8_t data = 0x55; // 二进制01010101,共4个1
uint8_t parity = 0;
uint8_t count = 0;
for (int i = 0; i < 8; i++) {
if (data & (1 << i)) count++;
}
parity = (count % 2 == 0) ? 0 : 1; // 偶校验:1的个数为偶数时校验位为0
// 发送帧:起始位0 + data(8位) + parity + 停止位1
接收端收到数据后,重新计算数据位的校验值,与接收到的校验位比对。若不一致,则置位“帧错误”或“校验错误”标志。需要注意的是,校验位只能检测奇数个比特错误,无法检测偶数个比特错误,也无法纠错。
案例拆解:Modbus RTU协议的帧格式应用
Modbus RTU是工业自动化中最常用的串口协议,其帧格式为:地址码(1字节)+ 功能码(1字节)+ 数据(N字节)+ CRC16校验(2字节)。在物理层,Modbus RTU通常运行在RS232/RS485上,UART参数固定为8位数据、无校验、1位停止位(8N1)。为什么不用偶校验?因为Modbus RTU在应用层已经包含了CRC16强校验,物理层的奇偶校验显得多余,且会增加帧长度、降低效率。这个案例说明:校验位的选择取决于上层协议是否已有更强大的错误检测机制。如果上层协议没有校验(如裸数据传输),则建议启用奇偶校验。
常见误区与总结
- 发送端8N1(8数据位、无校验、1停止位),接收端8E1(8数据位、偶校验、1停止位)→ 接收端会多读1位校验位,导致数据错位。
- 发送端8N2(2位停止位),接收端8N1 → 接收端可能将第2个停止位误判为下一帧的起始位,导致帧同步丢失。
调试建议:使用逻辑分析仪或示波器抓取TX/RX波形,对照帧格式逐位解析,是定位此类问题的最快方法。
2.5 综合实战:配置一个可靠的RS232通信链路
场景描述与目标
某工厂需要将一台老式称重仪表(RS232接口)的数据实时上传到工控机。仪表输出格式为:每100ms发送一帧ASCII字符串,格式为“ST,GW,001.235,kg\r\n”,波特率固定为9600,8位数据,无校验,1位停止位。工控机需通过USB转RS232串口线接收数据,并解析重量值。
关键输入与参数
- 仪表RS232参数:9600, 8, N, 1(出厂固定,不可修改)
- 线缆长度:5米,屏蔽双绞线
- 工控机操作系统:Windows 10,使用串口调试助手或Python pyserial
分析判断过程
首先,确认USB转RS232线缆的驱动是否安装正确,在设备管理器中查看COM口号。然后,使用串口调试助手打开对应COM口,设置波特率9600、数据位8、停止位1、校验位None。若收到乱码,则检查线缆接线(2-TX、3-RX、5-GND)是否正确,特别是TX与RX是否交叉连接。若完全无数据,则用万用表测量RS232电平:空闲时TX应为-3V~-15V(负逻辑),发送数据时应在±3V~±15V之间跳变。若电平为0V,则线缆断路或仪表未上电。
实际操作步骤
- 连接硬件:仪表RS232 DB9公头 → 屏蔽线 → USB转RS232线缆 → 工控机USB口。
- 打开设备管理器,确认COM口编号(如COM5)。
- 使用Python脚本测试接收:
import serial
ser = serial.Serial('COM5', 9600, bytesize=8, parity='N', stopbits=1, timeout=2)
while True:
line = ser.readline() # 读取一行,直到\r\n
if line:
text = line.decode('ascii', errors='ignore')
if text.startswith('ST,GW,'):
weight = float(text.split(',')[2].replace('kg',''))
print(f"当前重量: {weight} kg")
- 运行脚本,观察输出。若输出正常,则通信链路建立成功。
结果对比与复盘
通过上述配置,工控机成功接收并解析了称重数据。若在测试中发现偶发乱码,可能原因包括:线缆靠近变频器等强干扰源、接地不良导致共模电压过高、波特率偏差(仪表晶振老化)。解决方案:采用RS422/RS485差分传输替代RS232单端传输,或增加磁环滤波器,或检查接地环路。此案例表明,串口通信的可靠性不仅取决于参数配置,还取决于物理层电气特性和现场布线。
1. 波特率是否一致(误差<2%);
2. 数据位、停止位、校验位是否完全匹配;
3. TX/RX是否交叉连接(DB9公头2-TX、3-RX,母头相反);
4. 地线(GND)是否连通,这是RS232通信的必备条件。