UART串口流控制(Flow control)

一般在串行通讯中,我们会在一些上位机上看到 RTS /CTS、DTR /DSR和 XON /XOFF的选项,这是对流控制的选项,一般是应用于 RS232接口的,是拿来调制解调器的数据通讯的

FROM:https://javaforall.cn/134993.html
一、流控制的作用

这里讲到的 “流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失

二、工作原理

当接收端的数据缓冲区已满,无法处理数据来时,就发出 “不再接收” 的信号,发送端则停止发送,直到发送端收到 “可以继续发送” 的信号再发送数据。计算机中常用的两种流控制分别是硬件流控制(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型的管脚分配:

代码语言:javascript

复制

         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串口通信;它是采用特殊字符来传输带内信令,特殊编码字符称作 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底层控制

上面也有说到,硬件流控制最后的实现还是绕到了软件上,若果是去写串口上位机控制的,可以看一下下面的链接,了解它们对应的寄存器

链接:串列埠的原理與應用

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134993.html原文链接:https://javaforall.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UART流控(VB)是在Visual Basic编程语言中用于控制串口通信的功能。UART代表通用异步收发传输,它是一种用于串口通信的标准协议。流控是一种机制,用于确保数据传输的稳定性和可靠性。 在VB中,使用UART流控需要先创建一个串口对象,并设置相关参数,例如波特率、数据位、校验位和停止位等。然后,可以使用相应的方法和事件来控制串口的数据收发。下面是一个简单的示例代码: ```vb ' 创建串口对象 Dim serialPort As New System.IO.Ports.SerialPort() ' 设置串口参数 With serialPort .PortName = "COM1" ' 设置串口号 .BaudRate = 9600 ' 设置波特率 .Parity = IO.Ports.Parity.None ' 设置校验位 .DataBits = 8 ' 设置数据位 .StopBits = IO.Ports.StopBits.One ' 设置停止位 .Handshake = IO.Ports.Handshake.RequestToSend ' 设置流控为请求发送 End With ' 打开串口 serialPort.Open() ' 发送数据 serialPort.Write("Hello, UART!") ' 等待接收数据 Dim receivedData As String = serialPort.ReadLine() ' 关闭串口 serialPort.Close() ``` 在上述示例中,我们创建了一个串口对象`serialPort`,设置了一些串口参数,如端口号、波特率等。然后,可以使用`Write`方法向串口发送数据,并使用`ReadLine`方法等待接收数据。最后,使用`Close`方法关闭串口。 总之,在VB中使用UART流控是一种控制串口通信的方便方法,可以确保数据的准确传输,适用于各种串口通信场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值