TODO:整理
【整理】HART协议中串口配置和Handshake(RTS/CTS等)
先列出关于流控制协议的一些名词:
于此相关的其他一些名词:
比如,计算机终端
原先定义为,数据通信设备,比如调制解调器Modem
RTS/CTS和DTR/DSR,用的物理引脚是不同的;
而关于DTR/DSR和RTS/CTS共存(没有统一只使用单个的一组硬件引脚(要么用RTS/CTS,要么用DTR/DSR)去实现流控制)的原因是:
背景是:
最开始先出现的RTS/CTS,但是设计出RTS/CTS的初衷,即原先的目的,就不是把RTS/CTS去用来当做流控制的
-> 而是用来:去协调两个半双工(工作模式下的)的猫modem之间的通讯
-> 不至于让两个半双工的modem,在通讯时,互相掐架,互相抢占数据通道,互相同时要么都要发送数据,要么都要接受数据,由此而容易导致混乱和(总线上的)数据异常
-> 但是结果,(被设计用于协调两个两个半双工的modem之间的通讯的)RTS/CTS,结果被大家误用,误当做(后来大量出现和使用的,全双工的串口等设备中的)流控制
-> 即,对于都是全双工的两个串口来说:
计算机(上面的串口) <-> (开发板或其他设备上面的)串口
分别对应着的概念是:
DCE <-> DTE
此处,分别叫做:
数据发送方 <-> 数据接收方
此处,暂且叫做:
串口A <-> 串口B
此时就是:
A打算发送数据到B中
A设置RTS(Request To Send),表示:请求发送(数据到对方)
此时:
清除(发送者A之前的设置的RTS),表示可以接受数据了
Clear表示OK,清楚,明白,意思是明白对方的意思了,表示对方可以发送数据了
DTR/DSR,主要是用来做建立链接
即,数据发送和接受之前,先要建立A和B的连接,这时候才用到DTR/DSR
A设置RTS表示要发送数据给B,而B设置CTS表示可以接受数据,通知A发送数据给B,A就开始去真正的发送数据给B了
的背景是:
硬件连接是:
对应的:
对应的,A要发送数据给B的执行过程是:
对于目前常见的,直接两个DB9的串口直接相连,物理上对应的引脚的接法:
目前对于DTR/DSR的理解:
数据发送和接受之前,先要建立A和B的连接。这时候才用到,用于建立链接的,DTR/DSR
RTS/CTS的流控制过程如下:
如果A和B,(其中A是Imager,要发送图像数据,B是对应的接受设备),A想要发送数据给B,那么用硬件的RTS/CTS作为硬件流控制机制的话,
A如果想要发送数据给B的话,A会使得RTS(Request To Send)引脚有效,表明其想要“请求发送”数据给作为接收设备的B,
然后A接着就会去检测对应的来自B的CTS引脚,直到CTS有效(此时意味着B已经做 好了相关的准备工作了,然后设置了CTS(Clear To Send) ,表明自己准备好接受数据了),才会真正开始发送数据。
并且在接下来发送每个字符(data character)之前,都会去检测对应的CTS是否有效
如果有效,才会继续传输对应的数据,
如果发现CTS无效(此时意味着B那么发生了啥情况,导 致无法继续正常接受数据了,所以将CTS设置为了无效),那么就不能再继续发送数据。
对于上述CTS一直有效的情况下,A就一直发送数据给B,到了最后数据发送完之后,再把RTS设置为无效,表示数据已经发送完了。
这就是整个单个的数据发送流程,用RTS和CTS来控制传输的逻辑。
对此流程,做个简单的比喻,未必很恰当,但是可以很形象的说明数据发送的流程:
A和B,相当于马路的两边,A要发送数据给B,就相当于A要过马路,具体的流程就是:
就相当于A要将CTS设置有效,表示要发送数据(过马路到B那里去)
B对于接下来将要接受的数据,要有一个准备的过程,这要花点时间,在这段时间内,肯定不会让你发送数据
也就是亮红灯不允许你过马路,将CTS设置无效,表示我还没准备好
然后A那边呢就一直检测CTS是否有效,发现是无效,就知道现在B那边还没准备好,不允许我发送数据
然后过了会B准备好了, 就把CTS设置为有效,表示准备好了,A可以发送数据给B了,即亮绿灯,让A过马路了
而A此时就检测到CTS是有效的了,就可以发送数据了,即看到绿灯,可以过马路了。
接下来的,A要把一个个字节的数据(就相当于一个个要过马路的人),发送给B
在发送之前都要像前面一样,去检测CTS是否有效
如果有效,就亮绿灯,可以继续发送数据,即过马路
如果CTS无效,说明B出啥问题了,比如缓存满了,要处理一下,接着再让你发送数据,就亮红灯,A不能继续过马路了。
然后A就一直检测CTS直到CTS有效,再发送数据,即A一直看灯,直到红灯变绿,再继续过马路。
所有的A都过完马路了,就把原先设置的标示RTS设置为无效,表示数据发送完成了。
可以将上面一大堆繁琐的解释,总结为简单的逻辑: