串行通信技术:面向嵌入式系统开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.7 RS-232与RS-485的区别

一般人认为,RS-232、RS-485及RS-422仅仅是电气接口有所不同,以为它们三者的通信协议是一样的。其实,它们之间的协议是有微妙差异的,尽管有时候用户并没有感觉到。在进行串行通信编程时也没有考虑到RS-232与RS-485的差异,却并没有出现问题。这是因为串口(包括计算机和设备)生产厂家已经事先进行了考虑。

RS-232与RS-485的唯一区别在于,RS-485有发送器的控制信号DE(Drive Enable),而RS-232无须这个信号。因为前面讲过,RS-485不能够同时接收和发送,那么就需要收发切换。由于同一条RS-485总线上任何时候不允许有两个RS-485接口同时发送,否则会导致冲突,所以重点在于对发送的电子切换。RS-232的发送信号TXD与接收信号RXD各用一根线,所以不存在收发切换的问题。在DB-9的RS-232接口上除了发送信号TXD与接收信号RXD,还有几个握手信号。比如有一个RTS信号,当计算机的RS-232接口外接Modem时用做握手信号,与Modem的CTS相连接。由于现在用做工业控制通信的RS-232接口普遍只用到RXD、TXD、GND这三根线,RTS、CTS等握手信号就不再使用了。当把计算机的RS-232接口从外部转换为RS-485接口时,由于RS-485通信只需要RXD(接收)、TXD(发送)和GND(地),所以其他握手信号,包括RTS就空出来了,这样就可以把RTS(或者STR)作为RS-485发送器的控制信号 DE(Drive Enable),当然还必须经过电平转换。这样就可以将 RS-232 接口转换成RS-485 接口。对这样转换出的 RS-485 接口,在编写串行通信程序时就必须考虑 RS-232 与RS-485之间的差别,当每次发送数据时RS-485必须先置RTS为有效,相当于置RS-485的DE信号为有效;当发送数据结束后必须置RTS为无效,相当于置RS-485的DE信号为无效。由于这样增加了编程的复杂性,所以会导致RS-485与RS-232通信软件的不兼容。

为了解决这种RS-232与RS-485通信软件不兼容的问题,现在计算机USB扩展出的RS-485接口从硬件上对DE信号进行了自动处理,保证了与RS-232的兼容。比如英国FTDI公司的USB转串口的FT232R芯片,对RS-485的控制信号DE完全是由芯片硬件自动处理的。如图1-6所示,只要串口有信号要发送,FT232R芯片就自动置DE为1(允许状态),允许RS-485发送,一旦发送结束立即置DE为0(禁止状态),平时DE为禁止状态。这就避免了同一个RS-485总线里多个主机同时处于发送状态的冲突,另外在RS-485通信程序上用户无须对RS-485的发送允许信号进行处理,与RS-232的三线(RXD、TXD、GND)通信程序完全一样。

图1-6 基于FT232R芯片的USB转RS-485电路

RS-422在电气接口上与RS-485是一致的,区别在于RS-422是全双工的,RS-485是半双工的,而RS-232也是全双工的。同样,RS-485与RS-422的协议区别在于,RS-485需要DE信号(发送允许)而RS-422则不需要。也就可以说,RS-485的通信程序完全可以适用于RS-422信号,不过就是把DE信号空着。同理,如果通信软件上不用到RTS、CTS等握手信号,只用到RXD、TXD和GND,那么RS-422协议与RS-232协议是一样的。