数据在传输过程中容易出现数据丢失的现象,例如:两台计算机通过串口传输数据时,或者台式机与单片机之间进行通信时,可能由于两端计算机的处理速度不同,出现接收端的
数据缓冲区已满,而发送端依然继续发送数据,则导致数据丢失。流控制的出现就是为了解决这种数据丢失的问题。
这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端
数据缓冲区已满,则此时继续发送来的数据就会丢失。我们在网络上通过modem进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 pc机中常用的两种流控制是硬件流控制(包括rts/cts、dtr/dsr等)和软件流控制xon/xoff(继续/停止)。
硬件流控制必须将相应的电缆线连上。硬件流控制常用方式为:RTS/CTS(请求发送/
清除发送)流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
当用RTS/CTS流控制时,需将通讯两端的RTS、CTS线对应相连,
数据终端设备(如计算机)使用RTS来启动
调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来启动和暂停来自计算机的数据流。这种硬件握手方式的过程为:通过程序为接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
由于电缆线的限制,普通的控制通讯中一般不用硬件流控制,而使用软件流控制。软件流控制常通过XON/XOFF来实现。这种软件握手方式的过程为:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书会有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的字符是什么。
当通过软件流控制方式传输二进制数据时,标志字符也有可能在
数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。