串口与modem流量控制大全(1)

MODEM是用户接入互联网的重要设备。虽然网络干线上已经普及宽带光纤传输,但是在拥有庞大用户群的最后一公里路段上,目前最现实的接入方式还是铜线连接(电话线,双绞线、电缆)。另外,随着无线技术的发展,采用无线接入的固定/移动用户也越来越多。不论是铜线连接还是无线接入,都要采用调制解调器,以便使数据信号能够在信道内传输。
 
   MODEM的对外接口是串口,这个串行I/O口用于传输控制信号、状态信号、数据、AT指令及其响应。虽然MODEM种类繁多(56K猫/GPRS/CDMA等),但对外都表现为一个标准的串口,只要将这个串口了解清楚,那么就可以将所有的MODEM一网打尽。
   
    *************
    * (1) UART   *
    *************
    一般地,我们把这个串口叫作UART(Universal Asynchronous Receiver and Transmitter通用异步收发器)。
    其中,RT是接收和发送的英文缩写,能收能发又是串口,说白了就是串行I/O口的意思。
    A表示异步模式。这种模式的优点是适应性强,对时钟精度要求低(成本低)。每次发送字节数据前都首先发送一个开始位同步时钟相位,抖动误差不会在整个通信过程中累积,只影响单个字节的传输单元。
    U的意思是通用。为什么一定要冠以“通用”二字,这个定语到底想强调什么呢?
    话说很早以前,还没有出现计算机的时候,就已经出现了串口设备。例如:MODEM、电传打字机、工控设备、数传机等等。为了方便设备互连,EIA制定了RS232标准化规范,采用DB25接口连接DTE(Data Terminal Equipment数据终端设备)和DCE(DataCommunicationsEquipment数据通信设备)。后来,出现了个人计算机(PC机),这些已有的设备毫无疑问地成了最初的外设,为了将其接入主机,制造商们自然地选择了标准的RS232串口。在这个标准中,DB25接口支持同步和异步两种工作模式,采用D型接插件,防止插反。这种设计兼容性好,使用方便,但是制造商们并不买帐,他们更倾向于进一步减少接插件的大小和成本。通过删除DB25中未使用的引脚和支持同步模式的引脚,将DB25改造成只有9根线,只支持异步模式,体积更小,成本更低的DB9。最初的状况比较混乱,因为DB9只给出了信号范围,但没有指出引脚和信号的对应关系,而且DB9也不是RS232规范所定义的接口标准,因此各个制造商只能自行定义对应关系。后来,IBM制造的PC机成了行业标准,DB9的对应关系就逐渐统一到了IBM的定义上,现如今使用的DB9就是遵守的IBM的定义。随着时代的发展,计算机越来越普及,外设的种类也越来越多,有些非RS232的串行设备需要接入主机,这就要求主机提供更多的I/O口。如果为每一种新出现的设备都提供一个I/O,显然是不现实的,因为主机后面板位置有限,不可能容纳太多的接口。幸运的是,外部I/O口大体上主要分为两类:并口和串口。如果复用已有的RS232串口接入非RS232的设备,那么就可以用有限的接口,接入大量的设备。一个有趣的现象是,早期的操作系统DOS和ROMBIOS提供的通信例程只支持RS232串口标准,即使是实现简单的字节收发这种非RS232应用,竟然也要先检测DSR、DCD、CTS等信号是否有效,如果不满足条件,将不会发送数据到TXD上。解决这个问题的方法有两种:1、旁路系统提供的API函数,自己直接操纵硬件实现非RS232的操作;2、短接接头里某些RS232控制信号线,使系统通信例程误以为是RS232设备,使非RS232的设备满足RS232规范的子集要求。
    现在,PC机上的串口既支持RS232应用又支持非RS232应用,通用串口指的就是这个意思。RS232规范对速度和距离都有约束,在码元畸变小于4%的条件下,传输距离上限是15米;速率上限是19200。目前,在PC机上的串口都突破了RS232标准的限制,速度可以达到115200甚至更高。软件上,已经可以选项配置是否支持硬件流控,是否检查DSR、DCD、RI等输入信号。可以说,现在的PC串口,来源于RS232,但又不拘泥于它的限制,越来越向通用目的的串口方向发展。UART到此可以总结为:用于通用目的的异步串行I/O口。
    综上,可以看出计算机串口发展的大致历程:
    (个 人计算机)史前出现原始的串口设备 --> EIA制定RS232统一标准,DB25出现--> 个人计算机诞生,为引入串口,DB9出现,软硬件仍然遵循RS232标准-->为引入新的非RS232串口,将原来的RS232口改造成通用目的的UART,软硬件可以不遵循RS232规范。
   
    PC机串口拥有多个名字:串口、RS232口、COM口(通信口)、异步口、UART等,他们是不同历史时期的产物,一直沿用至今,让现在的人们感觉有些莫名其妙。最开始PC机接入的串行外设是RS232设备,就叫RS232口。这个设备主要是通信用的MODEM,PC上就称为COM口。现在连非RS232设备也接了进来,就叫UART吧。不过新名字没有老名字有名,有些人的习惯改不过来,再说计算机发展太快,老名字还没消失,新名字就出现了,而且各有各的拥趸,约定俗成,那就这么乱着叫吧。
   
    就在UART准备一统江湖的时候,制造商们再一次不满于它的速度、灵活性(软件可配置)和体积,推出了USB串口和1394串口。现在越来越多的笔记本电脑上已经取消了UART串口,因此有不少网友发出“没有串口,吾谁与归”的慨叹,历史前进的脚步无法阻挡,古今多少事,都付笑谈中,USB取代UART是后话,暂且不表。
   
    *************************
    * (2) DB9引脚定义和表示 *
    *************************
    DB9遵循IBM定义,所有输入输出方向都是站在DTE角度说的。
    1--载波检测DCD    2--接收数据RXD    3--发送数据TXD    4--数据终端就绪DTR    5--信号地GND
    6--数据设备就绪DSR    7--请求发送RTS    8--清除发送CTS    9--振铃指示RI
   
    在TXD和RXD上:(一般,驱动器件都是反相器,用负表示"1",用正表示"0",采用负逻辑,完全可以理解。)
                    逻辑0(SPACE 空号) = +3V~+15V
                    逻辑1(MARK 传号)   = -3V~-15V
                   
    在RTS、CTS、DSR、DTR和DCD等控制线上:
                    信号有效(接通,ON状态,正电压,高电平)= +3V~+15V
                    信号无效(断开,OFF状态,负电压,低电平) = -3V~-15V

    -3V到+3V之间的电平无意义,称为死区,不应该处于这个电压范围。+3V以上,-3V以下的一段区间属于过渡区,尽量不要使电平落入此区间,以便使判断更可靠,最好在+12V以上,-12V以下。一般的驱动器件为+-12V电压。工程上,电压不可能如此理想,判断需要在一定范围内进行,有些半导体器件也不容易升压到+-15V,同时,大摆幅电路速度也高不了。
   
    以上说的是RS232电平,在未经驱动的芯片引脚上是TTL电平:
                    信号有效  二进制0   = 0-0.3V
                    信号无效  二进制1   = 3.3V/5V
                    如果不经RS232驱动芯片,直接把MCU和Modem模块(TTL电平)连接,需要注意电平兼容。

    ****************************
    * (3) DB9引脚信号详细说明   *
    ****************************
    注意:硬件只提供机制而不提供策略,RS232的规范由软件实现,硬件只是提供标准的硬件信号线。例如:载波检测由软件完成,硬件只提供DCD引脚信号。硬件流控并不是说将RTS和CTS接到相应引脚位置上,硬件就可以自动实现流量控制,硬件流控是靠软件实现的,之所以强调“硬件”二字,只是因为硬件为软件提供了指示信号的硬件通路,而软件流控没有使用硬件指示信号罢了。
    RS232规定的是DTE和DCE设备间连接,而现在大多数设备已经内嵌了CPU,可以主动发送数据,因此成了DTE设备,DTE和DTE的连接RS232里没有规定,需要使用交叉线。
    有兴趣的读者可以尝试着分别剪断9根线,看看会有什么现象发生。看看拨号软件将弹出什么样的错误信息。
   
    TXD(Transmitted Data发送数据),RXD(ReceivedData接收数据)------数据传输物理通道,DTE和DCE设备此引脚一一对应连接即可,两个DTE设备需要交叉连接。所谓收发全是站在DTE角度说的。可以在这两个引脚对应的芯片引脚上连接LED指示灯,在数据收发时会有闪烁指示。这两个信号连接芯片内部的并/串和串/并电路,先处理低位,硬件上不受其他硬件控制信号的影响。
   
    GND(Ground地)----------地参考点。RS232是非平衡接法,不是差分的,所以抗噪性能不好,收发信号需要高电压+15V/-15V,摆幅大,速率低。此地使两端电位参考点一致,避免了地回路。
   
    DCD(Data CarrierDetect数据载波检测)----------当话音通路建立后,两端Modem各自发送单频载波,以便各自的对端实时检测链路通断。只要检测到载波信号,DCD就有效。此信号无效时用于触发no carrier事件,提供向上层传递lowerdown消息的机制,使PPP复位,并根据策略决定是否断线重拨。在PPP收发数据时应实时监测DCD信号,只有当DCD有效时才能进行收发操作。
   
    DTR(Data Terminal Ready数据终端准备好),DSR(Data SetReady数据设备准备好)----------虽然通过RXD和TXD就可以收发数据,但是在发送数据前还是应该先确定对方是否准备好,以避免不必要的数据丢失。DTR和DSR引脚用于主硬件流控。DTR有效表示DTE设备可以接收数据,DSR有效表示DCE设备可以接收数据。DTE向DCE发送数据前要检测DSR信号,如果无效将不会发送,同样,DCE向DTE发送数据前也要先检测DTR是否有效。这是RS232规范的要求。
    MODEM并没有使用DTR和DSR实现通常意义上的硬件流控。DTR在整个通信期间保持有效,DSR在MODEM上电后立即有效/在发出载波后有效(这取决于程序对DSR的理解,是把它简单地看成电源开关指示还是看成拨号后的指示)并在整个通信过程中一直保持有效。DTR或DSR在任何时间点无效,都将终止通信过程。有人可能奇怪RS232标准里明明使用这两个信号用于主硬件流控,为什么MODEM却这样安排时序呢?原来MODEM根本就没有按照RS232的规范将DTR和DSR用于硬件流控,它只使用这两个信号指示DTE和DCE已经上电,可以开始工作。当然这在某种意义上也算是流控,但它确实不是RS232所指的那种,MODEM是通过RTS和CTS实现的硬件流控。
    DTR和DSR的这种使用方法最初是由贺氏Hayes公司在Smart Modem里最先采用的,后来贺氏HayesMODEM成为行业事实上的标准,其他公司参照贺氏设计的时序生产与其兼容的MODEM,甚至连AT指令都一样(大家一起抄他呗)。因此,现在的MODEM都不遵守RS232在这两个引脚上定义的用法了。
    Data Terminal和DataSet是两个过时的名字,这两个术语已经被废弃了(谁还记得数据终端和数传机啊,早就成古董了,兴许在博物馆还能见到实物)。RS232-D版本中起用DTE ready和DCE ready两个新名字。虽然新名字表达的意思清楚多了,但可以肯定的说,旧名字仍将继续使用。

    RTS(Request To Send请求发送),CTS(Clear ToSend清除发送)------------半双工时,用于收发模式切换。属于辅助流控信号。半双工的意思是说,发的时候不收,收的时候不发。那么怎么区分收发呢?缺省时是DCE向DTE发送数据,当DTE决定向DCE发数据时,先有效RTS,表示DTE希望向DCE发送,一般DCE不能马上转换收发状态,DTE就通过监测CTS是否有效来判断可否发送,这样避免了DTE在DCE未准备好时发送所导致的数据丢失。
    全双工时,这两个信号一直有效即可。
    以上所述是RS232标准的定义,然而在MODEM中,完全没有遵守这个规范,而是将其用于硬件流控。很多人根据RTS和CTS的字面意思理解他们的用法往往百思不得其解,再加上半双工/全双工,就更加云里雾里了。RTS和CTS在MODEM中的用法与他们字面的含义没有任何关系,他们已经由贺氏公司重新定义了用法。以下是网友dengm给出的程序,详细说明了RTS和CTS在MODEM里的用法。RTS用于指示本端是否可以接收数据,CTS指示对端是否可以接收数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt creator工程项目移植时因环境变换造成qmake错误的解决方案

1.问题描述:移植从他机上的qt工程项目,打开时提示: Qt Creator找到了一个由其他开发环境创建的设置文件,或许是来自于其他机器的。用户设置文件包含了特定的环境设定,它不应当被复制到其他应用环境中去。 你仍然想载入…

leftjoin多表联合查询_leetcode-sql练习精讲系列文章——一、多表如何连接

这是一个系列文章,涵盖了SQL最常用的知识点。题目来自于leetcode的sql题,文章列出了问题-完整解析-答案-知识点拓展-BAT等大厂面试真题。希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得…

噪声调频 matlab,如何用matlab编写噪声调频干扰信号

2013-11-01qsort函数怎么编?qsort,包含在stdlib。h头文件里,函数一共四个参数,没返回值。一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);其中第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写&s[i]这样的表达式);第二个参数是…

简明Python3教程 16.标准库

简介 python标准库作为python标准安装的一部分,其自身包含数量庞大的实用模块, 因此熟悉python标准库非常重要,因为很多问题都能利用python标准库快速解决。 下面我们将研究标准库中的一些常用模块。完整的标准库模块列表可以在安装python时附…

串口与modem流量控制大全(2)

PC端处理: 本端发送 当 发现(不一定及时发现) CTS (-3V to -15V)无效时,停止发送, 当 发现(不一定及时发现) CTS (3V to 15V)有效时,恢复发送; 本端接收 0&l…

php中的address,html中address是什么意思?(代码示例)

本篇文章主要介绍了关于address标签用法。或许有些朋友对于address标签有点陌生,也会产生address是什么意思的疑问,毕竟在我们日常建站过程中,很少会用到这个标签。但是俗话说,存在即合理。html里每一个标签都有他自己的定义和用处…

modem建链过程详述

终端 MODEM 步骤1|DTR-->| 步骤2|TXD-->| 步骤3|<--DSR| 步骤4|<--DCD| 步骤5|<--CTS| 步骤6|<--RXD| 1、由终端送DTR信号到MODEM&#xff0c;DTR信号由RS232的DTR脚送出&#xff0c;告诉MODEM终端已准备好&#xff1b; 2、终端送TXD信号到MODEM&#xf…

存储过程没有执行完后没有释放锁_面试必问---synchronized实现原理及锁升级过程你懂吗?...

synchronized实现原理及锁升级过程前言:synchronized是Java内置的机制&#xff0c;是JVM层面的&#xff0c;而Lock则是接口&#xff0c;是JDK层面的尽管最初synchronized的性能效率比较差&#xff0c;但是随着版本的升级&#xff0c;synchronized已经变得原来越强大了,本文带大…

C51存储器类型与51单片机的物理区域

1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。 2、 data区内最好放局部变量。 因为局部变量的空间是可以覆盖的&#xff08;某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖&#xff09;,可以提…

嵌入式MODEM通迅技术

摘要&#xff1a; 现今&#xff0c;市面上生产的各种嵌入式Modem可通过公众电话交换网络&#xff08;PSTN&#xff09;实现数据的传输功能&#xff0c;包括标准的串行和并行的接口&#xff0c;具有同步和异步的通信数据传输格式&#xff0c;支持多种Modem标准协议——V.92、V.9…

python删除mysql数据库_python 删除mysql数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

php音视频同步,视频画面和声音不同步?视频声音画面同步工具|软件

造成视频声音和画面不同步的原因&#xff0c;原因有三种&#xff1a;1、机器配置太低&#xff0c;播放高码率的视频文件容易造成不同步&#xff1b;2、片子本身就不同步&#xff1b;3、软件使用不当造成转换后的文件不同步。常见于 avi 文件和 rm/rmvb 文件。虽然我们下载的电影…

Hibernate C3P0连接池配置

本文向大家介绍Hibernate C3P0连接池&#xff0c;可能好多人还不了解Hibernate C3P0连接池&#xff0c;没有关系&#xff0c;看完本文你肯定有不少收获&#xff0c;希望本文能教会你更多东西。 Hibernate自带的连接池算法相当不成熟。 它只是为了让你快些上手&#xff0c;并不适…

cc、gcc、g++、CC的区别概括

gcc是C编译器&#xff1b;g是C编译器&#xff1b;linux下cc一般是一个符号连接&#xff0c;指向gcc&#xff1b;gcc和g都是GUN&#xff08;组织&#xff09;的编译器。而CC则一般是makefile里面的一个名字&#xff0c;即宏定义&#xff0c;嘿&#xff0c;因为Linux/Unix都是大小…

怎样在vs中监视char*字符串_字符串指针数据类型

一、前言在实际开发中&#xff0c;特别是芯片开发中&#xff0c;例如智能传感器芯片&#xff0c;经常直接使用C语言指针数据类型来操作寄存器。那么字符串指针就是我们常见的操作。C语言没有单独的字符串对象&#xff0c;它是通过数组的形式来表示字符串的&#xff1a;#include…

php mysql 替换 pdo,php操作MySQL数据库之PDO方式

这篇文章主要介绍了关于php操作MySQL数据库之PDO方式 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下基本使用1)连接数据库$pdo new PDO(“mysql:hostlocalhost; dbnamedb_name”,username,password);2)执行SQL语句$pdo ->…

.NET操作Excel

一.读取Excel数据&#xff0c;并显示 1.配置文件 <configuration> <system.web> <compilation debug"true" targetFramework"4.0" /> </system.web> <appSettings> <!--连接03版本的--> &l…

AC_CHECK_LIB的工作原理

AC_CHECK_LIB就是告诉configure我们需要检查哪些lib&#xff0c;并根据检查结果做什么处理。正是在这里遇到了问题并有所收获&#xff0c;才促使我写这篇blog记录一下。问题是这样&#xff0c;我想检查一下libXv.so这个库是否存在&#xff0c;不存在的话就让configure直接退出。…

mac json格式化工具_一个在 MAC 上 iOS/Flutter 开发的辅助工具

大家好&#xff0c;我是章鱼猫。今天给大家推荐的这个开源项目&#xff0c;是来自于我们公众号读者的投稿&#xff0c;这个东西还挺好的。如果你作为读者&#xff0c;也有自己的开源项目或者你也有想推荐的开源项目&#xff0c;都可以向我们投稿&#xff0c;我们就是致力于帮助…