UART串口流控制(Flow control)「建议收藏」

UART串口流控制(Flow control)「建议收藏」一般在串行通讯中,我们会在一些上位机上看到RTS/CTS、DTR/DSR和XON/XOFF的选项,这是对流控制的选项,一般是应用于RS232接口的,是拿来调制解调器的数据通讯的一、流控制的作用这里讲到的“流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然继续发送数据,所导致数据丢失二、工作原理当接收端的数…

大家好,又见面了,我是你们的朋友全栈君。

一般在串行通讯中,我们会在一些上位机上看到 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串口通信;它是采用特殊字符来传输带内信令,特殊编码字符称作 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.net/134993.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月5日 下午10:46
下一篇 2022年6月5日 下午11:00


相关推荐

  • BZOJ1172 : [Balkan2007]Dream

    BZOJ1172 : [Balkan2007]Dream

    2021年9月11日
    57
  • bitcomet官方_Bitcomet

    bitcomet官方_Bitcometudp://mgtracker.org:2710/announcehttp://share.camoe.cn:8080/announceudp://11.rarbg.me:80/announcehttp://tracker.tfile.me/announcehttp://open.acgtracker.com:1096/announcehttp…

    2022年10月1日
    5
  • 什么是Scrum?

    什么是Scrum?Scrum 是一个用于开发和维持复杂产品的框架 是一个增量的 迭代的开发过程 在这个框架中 整个开发过程由若干个短的迭代周期组成 一个短的迭代周期称为一个 Sprint 每个 Sprint 的建议长度是 2 到 4 周 互联网产品研发可以使用 1 周的 Sprint 在 Scrum 中 使用产品 Backlog 来管理产品的需求 产品 backlog 是一个按照商业价值排序的需求列表 列表条目的体现形式通常为用户故事 Scr

    2026年3月26日
    2
  • 网络协议之视频直播核心技术讲解

    网络协议之视频直播核心技术讲解网络视频直播存在已有很长一段时间,随着移动上下行带宽提升及资费的下调,视频直播被赋予了更多娱乐和社交的属性,人们享受随时随地进行直播和观看,直播的打开时间和延迟变成了影响产品功能发展重要指标。那么,问题来了:如何实现低延迟、秒开的直播?先来看看视频直播的5个关键的流程:录制->编码->网络传输->解码->播放每个环节对于直播的延迟都会产生不同程度的影响。这里重点分析移动设备的情况。受限于技术的成熟度、硬件环境等,我们针对移动场景简单总结出直播延迟优化的4个点…

    2022年7月21日
    20
  • C语言之enum的用法和注意事项(枚举类型)

    C语言之enum的用法和注意事项(枚举类型)在 C 语言中有一个关键字是 enum 枚举类型 不知道大家平时用吗 但是 enum 关键字在有些时候是非常方面的 下面说一下使用 enum 关键字的几种情况 定义枚举类型定义用关键字 enum 标识 形式为 enum 标识符 枚举数据表 注意 1 enum 是关键字 标识枚举类型 定义枚举类型必须用 enum 开头 2 枚举数据表中的名字是程序员自己设定 这些名字只是一个符号 但注意命名时要提高程序的可读性 枚举型是一个集合 集合中的元素 枚举成员 是一些命名的整型常量 元素之间用逗号 隔

    2026年3月17日
    1
  • 搭建 Python 开发环境

    搭建 Python 开发环境作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处前言所谓 工欲善其事 必先利其器 在学习 Python 之前需要先搭建 Python 开发环境 由于 Python 是跨平台的 所以可以在多个操作系统上进行编程 并且编写好的程序可以在不同系统上运行 常用的的操作系统为 Windows Linux MacOS Windows 上推荐使用 Windows7 及以上版本 另外 Python3 5 及以上版本不能在 WindowsXP 系统上使用 Lin

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号