一、串口的RTS和DTR是什么?
RS-232C接口定义(DB9)
- 1 载波检测 DCD(Data Carrier Detect)
- 2 接收数据 RXD(Received Data)
- 3 发送数据 TXD(Transmit Data)
- 4 数据终端准备好 DTR(Data Terminal Ready)
- 5 信号地 SG(Signal Ground)
- 6 数据准备好 DSR(Data Set Ready)
- 7 请求发送 RTS(Request To Send)
- 8 清除发送 CTS(Clear To Send)
- 9 振铃提示 RI(Ring Indicator)
当然,在这里它们的定义并不重要。
我们要关注的是 ” RTS = Request To Send ” 和 ” DTR = Data Terminal Ready ” 。
二、QSerialPort 中有控制RTS和DTR的接口吗?
我们打开QSerialPort的头文件,搜索RTS,找不到相关函数?
这时我留意到这四个函数:
于是我简单封装了一下函数:
void bbtSerialPort::setDTR(bool state)
{
if(serialPort->isOpen())
serialPort->setDataTerminalReady(state);
}
void bbtSerialPort::setRTS(bool state)
{
if(serialPort->isOpen())
serialPort->setRequestToSend(state);
}
再写两个 QCheckBox 控件
QCheckBox *RTSCheckBox = new QCheckBox("RTS");
QCheckBox *DTRCheckBox = new QCheckBox("DTR");
connect(RTSCheckBox, &QCheckBox::stateChanged, [=](int state){
if(!serialPort->isOpen()) return ;
if((Qt::CheckState)state == Qt::Checked) setRTS(true);
else if((Qt::CheckState)state == Qt::Unchecked) setRTS(false);
});
connect(DTRCheckBox, &QCheckBox::stateChanged, [=](int state){
if(!serialPort->isOpen()) return ;
if((Qt::CheckState)state == Qt::Checked) setDTR(true);
else if((Qt::CheckState)state == Qt::Unchecked) setDTR(false);
});
效果图:(串口的其他操作这里就不多讲了)
经验证,这两个函数就是用来控制RTS和DTR信号的。当 state 为 true 时,引脚为低电平,为 false 时,引脚为高电平。
其实QT有对这些进行处理,参见QT的文件。
一般在串行通讯中,我们会在一些上位机上看到 RTS /CTS、DTR /DSR和 XON /XOFF的选项,这是对流控制的选项,一般是应用于 RS232接口的,是拿来调制解调器的数据通讯的
一、流控制的作用
这里讲到的 “流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失
二、工作原理
当接收端的数据缓冲区已满,无法处理数据来时,就发出 “不再接收” 的信号,发送端则停止发送,直到发送端收到 “可以继续发送” 的信号再发送数据。计算机中常用的两种流控制分别是硬件流控制(RTS /CTS、DTR /DSR等)和软件流控制(XON /XOFF)
三、RS232引脚定义
RS-232设计之初是用来连接调制解调器做传输之用,也因此它的脚位意义通常也和调制解调器传输有关。RS-232的设备可以分为数据终端设备(DTE,Data Terminal Equipment, For example, PC)和数据通信设备(DCE,Data Communication Equipment)两类,这种分类定义了不同的线路用来发送和接受信号。一般来说,计算机和终端设备有DTE连接器,调制解调器和打印机有DCE连接器。但是这么说并不是总是严格正确的,用配线分接器测试连接,或者用试误法来判断电缆是否工作,常常需要参考相关的文件说明
RS-232目前有 DB-25和 DB-9型的连接器,被用的较多的是 DB-9型的接口
RS-232中 DB-9型的管脚分配:
DB-9 Male(Pin Side) DB-9 Female (Pin Side)
------------- -------------
\ 1 2 3 4 5 / \ 5 4 3 2 1 /
\ 6 7 8 9 / \ 9 8 7 6 /
--------- ---------
它的信号引脚说明:
脚位 |
简写 |
意义 |
信号 |
说明 |
---|---|---|---|---|
Pin1 |
DCD |
Data Carrier Detect |
数据载波检测(DCD) |
调制解调器通知电脑有载波被侦测到。 |
Pin2 |
RXD |
Receiver |
接受数据(RD、RXD) |
接收数据。 |
Pin3 |
TXD |
Transmit |
发送数据(TD、TXD) |
发送数据。 |
Pin4 |
DTR |
Data Terminal Ready |
数据终端准备(DTR) |
电脑告诉调制解调器可以进行传输。 |
Pin5 |
GND |
Ground |
公共接地 |
地线。 |
Pin6 |
DSR |
Data Set Ready |
数据准备好(DSR) |
调制解调器告诉电脑一切准备就绪。 |
Pin7 |
RTS |
Request To Send |
请求发送(RTS) |
电脑要求调制解调器将数据提交。 |
Pin8 |
CTS |
Clear To Send |
清除发送(CTS) |
调制解调器通知电脑可以传数据过来。 |
Pin9 |
RI |
Ring Indicator |
振铃指示(RI) |
调制解调器通知电脑有电话进来。 |
四、硬件流控制(以 RTS /CTS为主)
RTS/CTS最初是设计为电传打字机和调制解调器半双工协作通信的,每次它只能一方调制解调器发送数据。终端必须发送请求发送信号然后等到调制解调器回应清除发送信号。尽管 RTS /CTS是通过硬件达到握手,但它有自己的优势
1、RS232的标准连线法
当 A端的设备准备好后,发出 DTR(数据设备就绪)信号, 传至 B端的 RI(响铃)和 DSR(通讯设备就绪)。 这样,只要 A准备好(DTR),B端就会产生呼叫(RI)并准备好(DSR)。
注意到 A端的RTS(请求发送)、CTS(允许发送)和 B端的 CD(载波检测)连在一起, 则说明 A一旦请求发送(RTS)将立即得到允许(CTS), 并使 B端检测到载波信号(CD)。 A端的 TXD与 B端的 RXD相连,A发送,B接收。
2、RS232的简化连线法
原来 RTS和 CTS是用来询问和回答是否可以传输数据。 但在这种连接方式下,就成了纯粹告诉对方自己是否可以进行通讯。 此时 RTS和 DTR都可以用来对数据流进行控制。
A端的 DTR(数据设备就绪)发出信号, 当 B端准备好后,B端的 DTR(数据设备就绪)向 A端的 DSR(通讯设备就绪)发出信号。 接下来就可以通过 RTS(请求发送)和 DTR(允许发送)来控制通信。
3、进一步简化(也就是以 RTS /CTS为主)
从上面的流程可以看到,硬件流控制主要是 RTS /CTS和 DTR /DSR来控制,但是,人嘛,能懒就懒,因此现在很多时候都只是用 RTS /CTS告诉对方自己是否可以进行通讯,而直接跳过了 DTR /DSR的就绪状态检测
在使用 RTS /CTS时,它们都是低电平有效,因此,一般在上位机中一旦打开串口,RTS会拉置高电平,然后等待数据发送,使得低电平有效
值得注意的,并不是说硬件流控制就单纯的依靠硬件,它还需要软件去处理识别,因为硬件流控制所做的只是给出信号电平,真正的控制发送使能还得看软件的处理
五、软件流控制
软件流控制(Software flow control)是在计算机数据链路中的一种流控制方法,特别适用于 RS-232串口通信;它是采用特殊字符来传输带内信令,特殊编码字符称作 XOFF与 XON(分别表示 “transmit off” 与 “transmit on”)。因此,也被称作 “XON /XOFF流控制”;
使用 ASCII字符集,XOFF一般为字节值 19(十进制),XON为字节值 17
码的名字 |
含义 |
ASCII |
十进制 |
十六进制 |
---|---|---|---|---|
XOFF |
暂停传输 |
DC3 |
19 |
13 |
XON |
恢复传输 |
DC1 |
17 |
11 |
值得注意的是:是接受方把 XON /XOFF信号发给发送方来控制发送方何时发送数据的,这些信号是与发送数据的传输方向相反的
它的处理主要是:接收方利用 XON信号告诉发送方,我已经准备好接受更多的数据了,利用 XOFF信号告诉发送方停止发送数据,直到接受方发送 XON信号告诉发送方我再次准备好了。
XON /XOFF是一种工作在终端间的带内方法,但是必须两端都支持这个协议,而且在突然启动的时候会有混淆的可能;XON /XOFF可以工作于 3线的接口
软件流控制广泛用于低速设备,特别是打印机与哑终端,用以指出它们临时暂停接收数据;软件流控制的优点是降低了收发双方之间的电路导体数量,给定一个共同的电路接地,只需要两条电路分别用于收发,也不需要额外的特定硬件实现;缺点是发送 XOFF需要至少一个字符的时间,而且需要排在对方已经接收的数据之后处理
XON /XOFF一般不赞成使用,推荐用 RTS /CTS控制流来代替它们。 因为串口传输的是二进制数据,可能你发送的数据里面也有 XON、XOFF对应的二进制值出现,进而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题;当然,你也可以对 XON、XOFF进行特殊字符替换、组合等方式来确保通讯稳定
六、UART底层控制
上面也有说到,硬件流控制最后的实现还是绕到了软件上。
———————————————————————————-
DTR/DSR 和 RTS/CTS 流量控制有什么区别?
DTR/DSR 和 RTS/CTS 硬件流控制有什么区别?它们分别在什么时候使用?为什么我们需要多种硬件流控制?:)
- DTR——数据终端就绪
- DSR——数据集就绪
- RTS——请求发送
- CTS——清除发送
在这种通信机制中存在多种实现方式,因为标准中并未内建具体的协议。因此,设备厂商使用了各种自定义的“标准”实现。
仅从名称来看,RTS/CTS 似乎是一个自然而然的选择。然而,随着需求的变化,它们的方向却显得不合适。这些信号在早期设计时是为了解决一种情况:终端会批量发送一整屏的数据,但接收方可能无法及时处理,因此需要进行流量控制。后来问题发生了逆转,因为终端难以跟上来自主机的数据流量,但 RTS/CTS 信号方向相反——接口设计并不对称,也没有相应的反向信号。因此,设备制造商尽可能地进行了调整,使用了 DTR 和 DSR 信号。
补充说明
再详细说明一下,这是一个两级信号机制,因此“官方上”来说,只有当两个信号都激活时通信才能进行。该行为定义在最早的 CCITT(现称为 ITU-T)标准 V.28 中。
DCE 是一个连接终端和电话网络的调制解调器。在电话网络中还有其他设备负责将信号引导至数据网络,比如 X.25。
调制解调器有三种状态:关机、就绪(数据设备准备好,即 DSR 为真)和已连接(检测到数据载波,即 DCD 为真)。
在调制解调器连接前,终端无法进行任何操作。
当终端想要发送数据时,它激活 RTS 信号,调制解调器则通过 CTS 信号来确认请求。当调制解调器内部缓冲区满时,它会关闭 CTS 信号。
真让人怀念!
总结得很好。然后“软”流量控制 xOn/xOff 就出现了。
注意:80 年代中期以后,DTR/DSR 变得不如 RTS/CTS 常见。Linux 内核从未支持 DTR/DSR:当 Linux 内核支持 DTR/DSR 时,232 串行已过时。
这些信号不仅限于 RS232,还可用于 TTL UART。而且这些信号还远未过时。
因此,就 DTE(计算机)和 DCE(调制解调器)而言,RTS/CTS 可确保 DCE(调制解调器)不会被数据淹没,而 DTR/DSR 可确保 DTE(计算机)不会被数据淹没。这样对吗?
我记得没错。我已经很多年没有再担心过这些事情了。
没有回复内容