当前位置:首页 > 技术学院 > 技术前线
[导读]在嵌入式系统的所有通信接口中,串口通信是当之无愧的“常青树”。从8位51单片机到高性能64位嵌入式处理器,几乎每一款微控制器都标配至少一路UART串口,小到两个芯片之间的短距离数据交互,大到工业现场几公里外的设备组网,串口通信凭借实现简单、稳定可靠的特性,已经在工业领域稳定服役了几十年,至今依然是嵌入式开发者必须掌握的基础核心技能。很多新手刚接触串口时,照着示例代码配置好寄存器,能实现简单的收发就觉得掌握了串口,等到实际项目落地时,遇到丢包、乱码、通信不稳定的问题,排查半天找不到根因,本质上是没有真正理解串口通信的底层运行逻辑,只停留在调用收发函数的表层。

在嵌入式系统的所有通信接口中,串口通信是当之无愧的“常青树”。从8位51单片机到高性能64位嵌入式处理器,几乎每一款微控制器都标配至少一路UART串口,小到两个芯片之间的短距离数据交互,大到工业现场几公里外的设备组网,串口通信凭借实现简单、稳定可靠的特性,已经在工业领域稳定服役了几十年,至今依然是嵌入式开发者必须掌握的基础核心技能。很多新手刚接触串口时,照着示例代码配置好寄存器,能实现简单的收发就觉得掌握了串口,等到实际项目落地时,遇到丢包、乱码、通信不稳定的问题,排查半天找不到根因,本质上是没有真正理解串口通信的底层运行逻辑,只停留在调用收发函数的表层。

串口通信看似简单,背后藏着大量时序规范、硬件特性和工程落地的细节,把这些细节全部理清,才能写出在工业场景下长期稳定运行的串口驱动。今天我们就从底层原理、硬件分类、驱动实现到工程优化,全面拆解串口通信的完整知识体系,帮你真正把这项基础技能吃透。

串口通信的底层运行原理

串口通信的核心定义,是把数据的每一个二进制位,按照比特顺序在一根信号线上逐位依次传输,和并行通信一次性传输多个比特的特性完全不同,它的优势是只需要两根信号线就能实现全双工双向通信,布线成本极低,非常适合中低速长距离的数据传输。

最基础的异步串口通信,不需要额外的时钟同步信号线,收发双方提前约定好完全一致的波特率,就能完成数据传输。一帧完整的串口数据,由起始位、数据位、校验位、停止位四个部分组成。总线空闲的时候,信号线始终保持高电平状态,当发送方要发送数据时,先把信号线拉低一个比特的时间,这个低电平就是起始位,接收方检测到这个下降沿之后,立刻开始按照约定的波特率采样后续的比特信号。紧接着是5到8位不等的数据位,低位在前高位在后,依次串行传输,把一个字节的所有比特逐位发送出去。数据位传输完成之后,可以选择发送1位校验位,用来简单校验传输过程中是否出现比特错误,校验方式支持奇校验、偶校验等多种模式。最后是停止位,把信号线拉高保持1到2个比特的时间,代表一帧数据传输完毕,信号线回到空闲状态,等待下一帧数据的起始位到来。

整个异步通信的同步完全依靠双方约定的波特率维持,没有额外的时钟信号,这就要求收发双方的时钟频率偏差不能超过5%,否则随着传输比特的累积,采样点会逐渐偏移到相邻比特的区间里,最终导致采样出来的数据完全错乱,出现乱码。这也是为什么串口通信中波特率的精准度是保证通信稳定的核心基础,很多廉价的外部晶振精度偏差过大,跑出来的实际波特率和标称值偏差超过10%,就会频繁出现乱码问题。

不同电平标准的串口硬件特性

日常开发中我们常说的串口,并不是只有一种电气标准,不同的电平标准适配完全不同的传输距离和抗干扰场景,很多新手混淆不同电平标准的特性,直接把单片机的TTL串口和电脑的RS232串口直连,导致芯片直接烧毁,这类低级问题在新手开发中极其常见。

最基础的是TTL电平串口,也就是微控制器片上外设直接输出的串口信号,高电平的电压幅值等于主控芯片的供电电压,常见的是3.3V或者5V,低电平是0V。这种串口的传输距离非常短,通常只有一两米,只能用来在同一个电路板上连接两个芯片,比如单片机连接蓝牙模块、GPS模块这类板载外设,不能用来做长距离传输,而且不同供电电压的TTL串口不能直接互连,否则很容易出现电平不匹配导致的IO口过流损坏。

第二种是工业领域最常用的RS232电平串口,它的电平标准和TTL完全反向,用正负12V左右的电压代表逻辑状态,负电压代表逻辑1,正电压代表逻辑0。这种电平标准的抗干扰能力比TTL强很多,传输距离可以达到15米左右,过去的台式电脑后面板标配的9针DB9接口就是标准的RS232串口。现在的电脑已经不再标配RS232接口,通常需要用一个CH340或者PL2303芯片,把USB信号转换成TTL或者RS232信号,才能和嵌入式设备的串口连接。

第三种是工业现场大规模组网最常用的RS485差分串口,它采用两根差分信号线来传输信号,用两根线之间的电压差来代表逻辑状态。这种差分传输的特性让它具备极强的共模干扰抑制能力,传输距离最远可以达到1200米,一个总线网络上最多可以挂载几十个设备,是工业控制现场传感器、PLC组网的首选通信接口。RS485通常是半双工通信,同一时间只能有一个设备发送数据,必须通过额外的控制引脚切换收发方向,避免总线冲突。

不同电平标准的串口之间,必须通过对应的转换芯片完成电平转换,绝对不能直接直连,这是串口硬件设计最基础的原则。

嵌入式串口驱动的标准实现逻辑

几乎所有现代嵌入式微控制器的串口外设,都集成了独立的发送FIFO和接收FIFO,配合中断机制,完全不需要CPU全程轮询等待,就能实现高效的数据收发。

最基础的串口驱动实现,首先完成串口外设的初始化,配置好对应的波特率、数据位、校验位、停止位参数,开启接收中断和发送FIFO空中断。当外部有数据从串口发送过来时,数据首先进入串口的接收FIFO,当FIFO中的数据量达到触发阈值,或者超时时间到达时,立刻触发接收中断,在中断服务函数里把FIFO中的数据全部读取出来,存入预先定义好的环形缓冲区中。上层的业务逻辑直接从环形缓冲区中读取数据,完成协议解析处理,完全不需要在中断里处理复杂业务逻辑,大幅降低中断的阻塞时间。

发送数据的时候,上层业务把要发送的数据写入发送环形缓冲区,启动串口的发送中断,串口的发送FIFO变空时自动触发中断,在中断里从发送环形缓冲区取出新的数据填入FIFO,直到所有数据全部发送完毕,关闭发送中断。这种基于中断和环形缓冲区的驱动架构,CPU不需要全程等待串口收发,哪怕系统同时运行多个任务,串口也不会出现数据丢包的问题,是工业级串口驱动的标准实现方式。

在Linux系统中,串口被抽象成标准的tty字符设备,开发者不需要直接操作寄存器,直接打开对应的/dev/ttyUSBx或者/dev/ttySx设备节点,通过termios标准接口配置波特率等参数,调用read和write系统调用就能完成数据收发,完全不需要关心底层硬件的操作细节,应用层代码在不同平台上都可以无缝移植。

实际项目中的稳定性优化技巧

很多新手写出来的串口驱动,短距离测试完全正常,放到工业现场就频繁丢包乱码,这些问题都有明确的优化方案。

首先是硬件层面的优化,RS232和RS485的传输线必须使用屏蔽线,屏蔽层单端可靠接地,避免空间中的电磁干扰直接耦合到信号线上。RS485总线的首尾两端必须并联120欧姆的终端匹配电阻,消除信号在总线末端反射产生的回波干扰,大幅提升长距离传输的稳定性。串口的电源引脚旁边必须紧贴引脚放置滤波电容,滤除电源线上的高频干扰,避免干扰串入串口外设导致采样出错。

其次是软件层面的优化,不要在串口中断里执行任何复杂的运算、延时操作,所有数据解析业务逻辑全部放到主线程中处理,保证中断服务函数的执行时间尽可能短,避免后续到来的数据因为来不及读取被FIFO覆盖,导致丢包。在串口通信协议中增加帧头、帧尾和校验和机制,哪怕传输过程中出现个别比特错误,也能通过校验机制识别出错误帧直接丢弃,避免错误数据流入业务逻辑引发异常。如果是RS485半双工通信,必须精确控制收发方向的切换延时,发送完最后一个字节之后,等待至少一个字节的传输时间,再把方向切换到接收模式,避免最后一个字节还没发送完成就切换方向,导致数据发送不完整。

串口通信虽然是最古老的通信接口之一,但它的简单可靠特性,让它至今依然是嵌入式系统中不可或缺的基础通信方式。彻底掌握串口通信的底层原理和工程优化细节,是每一个嵌入式开发者必须修炼的基本功,后续学习其他更复杂的通信协议时,都能快速触类旁通。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭