串口通信这块,很多人知道RS232和RS485是两种不同的接口标准,但说到全双工和半双工具体有什么影响,往往说不清楚。这个问题在实际工程里挺要紧——协议选错了,轻则系统响应慢,重则数据冲突、设备互相干扰,排查起来很头疼。
一、全双工和半双工,物理上的区别
RS232是全双工的。发送(TX)和接收(RX)是两条独立的线,互不干扰,设备可以同时发数据和收数据,不需要任何切换动作。两台设备对话,就像打电话一样,双方随时都可以开口,不用等对方说完。
RS485是差分总线,标准的两线制RS485是半双工的。总线上只有一对差分线(A和B),发送和接收共用这一对线。任何时刻,总线上只能有一个设备在发送,其他设备必须处于接收状态。要发数据之前,先把自己的驱动器使能,发完再切回接收状态,让总线释放。这个切换动作是必须的,切换不到位就会发生总线冲突。
四线制RS485是另一回事——用两对差分线分别做发送和接收,实现全双工。但四线RS485在工业现场用得不多,大多数RS485设备还是两线半双工,默认情况下提到RS485,说的就是这种。
二、半双工带来的第一个问题:方向切换延迟
两线RS485设备发完数据、切换到接收状态,这个过程需要时间。时间有多长?取决于硬件驱动芯片和软件逻辑。
硬件层面,RS485驱动芯片的使能切换时间一般在几十到几百纳秒,这部分影响不大。麻烦的是软件层面,通过串口发数据,最后一个字节从UART的发送缓冲区移走之后,硬件上数据还没完全发完(还在移位寄存器里逐位发送),这时候如果软件已经把驱动器切到接收模式,最后几个位就发不出去了,接收端收到的是残缺数据。
所以软件要等到硬件确认最后一个字节彻底发送完成,再切换方向。很多平台上这个时机不太好掌握,常见的做法是发完之后等一个固定时间(比如一个字节时间的1.5倍),再切换,保险但慢。
在高波特率、短帧的场合,这个延迟比较显眼。比如Modbus RTU协议里,主机发完请求,从机要在3.5个字符时间内开始响应,加上方向切换的开销,时间余量就很紧张。设备数量多、波特率高的总线,这块处理不好容易出现超时。
三、半双工带来的第二个问题:总线竞争
RS485总线是共享介质,多台设备挂在同一对线上。任何时刻只能有一台设备在驱动总线,其他设备要把自己的驱动器切到高阻状态(tristate),让总线释放。如果两台设备同时驱动总线,A线和B线的电位被两个驱动器拉向不同方向,结果是差分电压混乱,两个设备发的数据都毁了,接收方收到的是乱码,严重的情况还会损坏驱动芯片。
这就是为什么RS485总线上的通信必须有明确的主从结构,或者有仲裁机制。Modbus RTU用的是严格的主从模型,只有主机发起请求,从机只有在收到发给自己的请求后才响应,从机之间不直接通信。这套规则保证了总线上任何时刻只有一个发送者。
如果系统里的设备不遵守这套规则——比如有设备定时主动上报数据,同时另一台设备也在发数据——总线冲突就不可避免。这种情况在自组协议或者调试阶段加临时代码时容易发生,查起来因为是概率性出现,特别烦。
四、RS232全双工的协议自由度
RS232因为收发独立,协议设计上自由度要大得多。设备可以随时发数据,不需要等对方先问,也不需要切换方向。异步通信的情况下,双方各自发各自的,对方自己处理接收缓冲区里的数据。
这种模式适合一些需要持续上报的场景:称重仪表实时发送重量数据,主机随时监听,不需要主机每次发请求才能拿到数据。或者双方有独立的心跳机制,发送和接收逻辑完全解耦,写代码也简单。
但RS232的这个"自由"在多设备场景里反而是问题。RS232是点对点的,一根线只能连两台设备,没有总线结构,每增加一台设备就要多占一个串口,设备数量多了之后串口资源就不够用了。RS485用一对线挂32台甚至128台设备,这个扩展性RS232完全没法比。
五、协议层面的差异:以Modbus为例
Modbus是工业现场最常见的串口协议之一,有Modbus RTU(跑RS485居多)和Modbus ASCII两种串行版本,另外还有Modbus TCP跑以太网。
Modbus RTU的设计完全是为半双工量身定制的。通信流程是主机发请求→等待从机响应,请求和响应之间有严格的时序要求,从机不会主动发数据。这套模型绕开了总线竞争问题,代价是轮询效率。如果主机要采集20台设备的数据,就要依次发20次请求、等20次响应,延迟累加起来,实时性有上限。
有些系统为了提高实时性,把轮询周期压得很短,结果相邻两次请求之间没有足够的间隔,上一个从机还在处理响应、方向还没切换完,下一个请求已经上总线了,导致通信错误。这种情况在Modbus RTU调试里相当常见,解决办法是适当拉大帧间隔,或者在软件层面加流量控制。
RS232上跑Modbus相对少见,但一些仪表的RS232口也支持Modbus RTU,差别是只能接一台设备,不构成总线问题,但全双工也没有让协议效率提升多少,因为协议本身就是半双工设计的——主机等从机响应期间,发送方向是空着的,全双工能力用不上。
六、软件驱动的隐患
工业项目里,RS485驱动的方向控制是个容易踩坑的地方,尤其是用PC或者ARM平台通过USB转RS485或者串口转RS485来做通信的情况。
很多转换器芯片支持自动方向控制(auto direction control),发送时自动切到发送模式,发完自动切回接收模式,不需要软件干预。这个功能用起来方便,但自动切换的时机和延迟由硬件决定,有时候和应用层的时序需求不完全吻合,某些协议里会出现偶发性通信失败,定位原因很花时间。
如果要精确控制方向切换时机,可以用有RTS引脚控制的硬件,软件手动控制RTS来驱动RS485方向切换,时机完全由自己掌控,代价是软件复杂一点。

L-com 用于RS-232传感器和控制线路的户外3级雷电浪涌保护器
七、选RS232还是RS485,实际怎么判断
一对一、距离短(15米以内)、不需要扩展设备数量,RS232简单直接,没有方向切换的麻烦。
一对多、距离长、需要挂多台设备,RS485是唯一合理的选择。方向切换的复杂性是绕不开的,选好硬件、把驱动逻辑写扎实就好。
如果有条件,两线RS485遇到实时性要求很高的场合,可以评估是否换成四线全双工RS485,或者直接升级到工业以太网。协议层的半双工约束对系统吞吐量的限制,有时候用硬件升级解决比在软件层面反复调参要彻底得多。
L-com 具有多种RS232和RS485线缆及连接器,各类工业级转换器帮助客户快速实现接口转换,产品海量现货库存,行业认证,一件起发,满足紧急连接需求。
八、快问快答
Q:RS485总线上最多能挂多少台设备?
A:标准RS485驱动芯片规定一条总线最多挂32个单位负载,折算成实际设备数量一般是32台。用低功耗高阻抗的RS485芯片(1/8或1/4单位负载),同一条总线可以挂到128台甚至256台。设备数量越多,总线的上升时间越慢,高波特率下信号质量会下降,设备多的时候波特率不能设太高。
Q:RS485通信老是超时,但换短线就好了,是什么原因?
A:多半是信号反射的问题。RS485总线两端要接终端电阻(120Ω),没有终端电阻的情况下,信号在总线末端反射,叠加到后续信号上导致误码,线越长反射影响越大。先确认总线两端有没有正确接终端电阻,再检查线缆特性阻抗是否匹配。
Q:RS232的TX/RX接反了会怎样?
A:不会烧设备,但完全收不到数据。RS232交叉连接是对的——设备A的TX接设备B的RX,B的TX接A的RX。直接对连TX接TX、RX接RX,两台设备的发送端对发送端,接收不到任何东西。这个错误太常见了,新做的线缆第一件事就是验证一下收发方向。
Q:半双工RS485能不能实现设备主动上报数据?
A:协议层面可以设计,但要处理好总线竞争。一种做法是给每台设备分配时间片,只在自己的时间窗口内发数据;另一种是主机定时轮询,触发从机上报。完全异步的主动上报在RS485半双工总线上很容易产生冲突,一般不这么做,Modbus RTU的主从模型是更稳妥的设计。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !