串口的RTS和DTR是什么?QT如何控制-Anlogic-安路社区-FPGA CPLD-ChipDebug

串口的RTS和DTR是什么?QT如何控制

一、串口的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,找不到相关函数?

这时我留意到这四个函数:

20241029182240225-image

于是我简单封装了一下函数:

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);
});

效果图:(串口的其他操作这里就不多讲了)

20241029182333936-image

经验证,这两个函数就是用来控制RTS和DTR信号的。当 state 为 true 时,引脚为低电平,为 false 时,引脚为高电平。


其实QT有对这些进行处理,参见QT的文件。

20241029184159994-image


一般在串行通讯中,我们会在一些上位机上看到 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的标准连线法

20241030185852628-image

当 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的简化连线法

20241030185908889-image

原来 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串口通信;它是采用特殊字符来传输带内信令,特殊编码字符称作 XOFFXON(分别表示 “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 中。

20241111082324905-image

 

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(计算机)不会被数据淹没。这样对吗?

我记得没错。我已经很多年没有再担心过这些事情了。 

 

 

 

请登录后发表评论

    没有回复内容