中电网移动|移动中电网|高清图滚动区

UART中的硬件流控RTS和CTS

在RS232 中本来 CTS 与 RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫(SmartModem)后就有点混淆了,不过现在这种意义为主流意义的,各大芯片制造厂家对 UART 控制器的流控基本采用 HAYES MODEM 流控解释。
 
在 RS232 中 RTS 与 CTS 是用来半双工模式下的方向切换,本文不解释;
 
如果 UART 只有 RX、TX 两个信号,要流控的话只能是软流控;如果有 RX,TX,CTS,RTS 四个信号,则多半是支持硬流控的 UART;如果有 RX,TX,CTS ,RTS ,DTR,DSR 六个信号的话,RS232 标准的可能性比较大。
 
SIMCOM 公司对 RTS/CTS 的解释:
 
(要注意区别是不是讲串口支持硬流控的 RTS/CTS,别看为益,在和瑞芯微调试硬件流控时,被这个非主流的解释搞得晕头转向的)
 
RTS 是模块的输入端,用于 MCU 通知模块,MCU 是否准备好,模块是否可向 MCU 发送信息,RTS 的有效电平为低。
 
CTS 是模块的输出端,用于模块通知 MCU,模块是否准备好,MCU 是否可向模块发送信息,CTS 的有效电平为低
 
HAYES Modem 中的 RTS ,CTS 是用来进 行硬件流控的。现在通常 UART 的 RTC、CTS 的含义指后者,即用来做硬流控的。
 
硬流控的 RTS、CTS:
 
(现在做串口使用 RTS/CTS 必看内容,因为 MTK/)
 
RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。
 
CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。
 
此处有人将 CTS 翻译为发送允许,我感觉的确比翻译为清除发送好。因为 CTS 是对方的 RTS 控制己方的 CTS 是否允许发送的功能。
 
用 AP 与 MODEM 采用流控收发串口数据举例:
 
CTS 为输入
 
RTS 为输出
 
AP 的 CTS 对接 MODEM 的 RTS;MODEM 的 CTS 对接 AP 的 RTS。
 
默认启动时:
 
AP 的 CTS 为高
 
AP 的 RTS 为低
 
MODEM 的 CTS       高     但极容易被拉低
 
MODEM 的 RTS       低
 
默认休眠时
 
MODEM 的 CTS       高     但极容易被拉低
 
MODEM 的 RTS       高
 
其中 CTS 用电压表测量电压时发现:在测量最初的大概 200ms 时,为高电平,然后电压值不断下降,变成低电平,这说明 CTS 悬空时应该为高,这中高电平仅仅是一定量的正电荷而已。
 
不知道芯片设计时,规格说明书为什么要写 CTS 默认为高,CTS 仅仅是输入端,不需要什么默认值啊。并且在流控打开情况下,不接 CTS 与 RTS,也是可以正常 3 根线(RXD/TXD/GND)通信的,这说明不接 RTS/CTS 时,CTS 为低电平才对。为何实际使用与芯片规格说明书不一致,可能是被外壳金属盖干扰到低电平了,毕竟自己用的模块,CTS 是如此靠近低电平的金属保护盖,并且 CTS 为输入口,没有上拉下拉电平能力。
 
AP 与 MODEM 的流控这样通信的:
 
AP 串口可用时,将 AP-RTS 拉低,MODEM-CTS 检测到 AP-RTS 为低,知道 AP 串口已准备好,可以发送数据;
 
AP 串口不可用时,将 AP-RTS 拉高,MODEM-CTS 检测到 AP-RTS 为高,知道 AP 串口还未准备好,就不会放数据。
 
MODEM 串口可用与不可用时的交互是同样道理。
 
没有串口控制器,用中断和普通 IO 口即可实现 RTS 与 CTS 功能。
 
RTS 用 GPIO 实现,串口就绪(无数据发送,等待接收)拉低电平,串口忙(自己有数据发送)拉高电平
 
CTS 用中断实现,检测到低电平,将串口数据发送出去,检测到高电平则保留串口数据直到检测到低电平为止。
 
下面是摘录网上有用的参考资料:
 
假定 A、B 两设备通信,A 设备的 RTS 连接 B 设备的 CTS ;A 设备的 CTS 连接 B 设备的 RTS 。
 
前一路信号控制 B 设备的发送,后一路信号控制 A 设备的发送。对 B 设备的发送(A 设备接收)来说,如果 A 设备接收缓冲快满的时发出 RTS 信号(RTS 拉高,RTS 无效,告知对方停止发送),通知 B 设备停止发送,B 设备通过 CTS 检测到该信号,停止发送;一段时间后 A 设备接收缓冲有了空余,发出 RTS 信号(RTS 拉低,RTS 有效,请求发送),指示 B 设备开始发送数据。A 设备发(B 设备接收)类似。
 
上述功能也能在数据流中插入 Xoff(特殊字符)和 Xon(另一个特殊字符)信号来实现。A 设备一旦接收到 B 设备发送过来的 Xoff,立刻停止发送;反之,如接收到 B 设备发送过来的 Xon,则恢复发送数据给 B 设备。同理,B 设备也类似,从而实现收发双方的速度匹配。
 
半双工的方向切换:RS232 中使用 DTR(Date Terminal Ready,数据终端准备)与 DSR(Data Set Ready ,数据设备准备好)进行主流控,类似上述的 RTS 与 CTS 。对半双工的通信的 DTE(Date Terminal Equipment,数据终端设备)与 DCE(Data circuitEquipment )来说,默认的方向是 DTE 接收,DCE 发送。如果 DTE 要发送数据,必须发出 RTS 信号,请求发送数据。DCE 收到后如果空闲则发出 CTS 回应 RTS 信号,表示响应请求,这样通信方向就变为 DTE->TCE,同时 RTS 与 CTS 信号必须一直保持。从这里可以看出,CTS ,TRS 虽然也有点流控的意思(如 CTS 没有发出,DTE 也不能发送数据),但主要是用来进行方向切换的。
 
流控制在串行通讯中的作用

这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我们在网络上通过 MODEM 进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。PC 机中常用的两种流控制是硬件流控制(包括 RTS/CTS、DTR/CTS 等)和软件流控制 XON/XOFF(继续 / 停止),下面分别说明。
 
硬件流控制

硬件流控制常用的有 RTS/CTS 流控制和 DTR/DSR(数据终端就绪 / 数据设置就绪)流控制。
 
硬件流控制必须将相应的电缆线连上,用 RTS/CTS(请求发送 / 清除发送)流控制时,应将通讯两端的 RTS、CTS 线对应相连,数据终端设备(如计算机)使用 RTS 来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用 CTS 来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的 75%)和一个低位标志(可为缓冲区大小的 25%),当缓冲区内数据量达到高位时,我们在接收端将 CTS 线置低电平(送逻辑 0),当发送端的程序检测到 CTS 为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将 CTS 置高电平。RTS 则用来标明接收设备有没有准备好接收数据。
 
常用的流控制还有还有 DTR/DSR(数据终端就绪 / 数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。
 
软件流控制

由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过 XON/XOFF 来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出 XOFF 字符(十进制的 19 或 Control-S,设备编程说明书应该有详细阐述),发送端收到 XOFF 字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出 XON 字符(十进制的 17 或 Control-Q),发送端收到 XON 字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
 
应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。
 
问题

1.UART 和 RS232 是什么关系?
 
UART(Universal Asynchronization Receviver/Transmite) 可以作为一种软件接口协议来看,包括 RS232、RS485、RS422 等接口标准规范和总线标准规范,这些标准规定了接口的电气特性(如电平)、传输速率、连接特性等,实际上属于通信网络中的物理层的概念,与通信协议没有直接关系,通信协议一般属于链路层即 link 层的概念。
 
那么 RS232 和 TTL 的 uart 什么关系呢?都是 uart 协议,就像上述提到的,只是电气特性如电平不同。
 
2.UART 是全双工通信,为何需要 RTS 和 CTS 来控制方向呢?
 
在 uart 全双工通信中是不需要 RTS 和 CTS 的,二者只是用在半双工通信中,如 RS485.
 
3. 在很多芯片手册中,uart 支持 IrDA(红外)和 RS485 模式,支持 RS485 模式是什么概念呢?
 
在 SAM4S 芯片手册中,RS485 模式是如下这么描述的:
 
While operating in RS485 mode, the USART behaves as though in Async or Sync mode and configuration of all the parameters is possible .

The difference is that the RTS pin is driven high when the transmitter is operating.
The RTS pin is controlled by TXEMPTY bit.
 
也就是说在 RS485 模式下,区别于正常模式在于当处于发送情况下,RTS 脚是拉高的,一旦发送结束(TXEMPTY 置位),RTS 拉低,通知对方可以发送数据,从而完成硬件自动流控。
 
下面图 1 为 SAM4S 的 RS485 模式连接图,图 2 为 i.MX6 的的 RS485 模式连接图。



4. 通常情况,串口起始位和停止位分别什么电平来表示?
 
起始位通常为低电平,用来同步;停止位为高电平,用来表示帧结束。

猜你喜欢
中电网移动|移动中电网|频道导航区