UART串口

2023-05-16

一、串口的历史

首先,串口对每一个做硬件和嵌入式软件的人来说,就是一个必备的工具,调试一个带MCU或者CPU的系统。我们在调试的过程中,一般第一件事情:GPIO点灯,第二件事就是打通串口。

    串口是一种非常通用的设备接口,是仪器仪表设备常用的通信接口,常用于远程采集设备数据或者实现远程控制。串口的开发也比较简单,是很多工程师最喜欢的接口之一。

在完成GPIO点灯之后,一般我们就希望能够实现串口打印的功能,便于我们将一些寄存器信息打印出来便于调试。

        由于我个人的特殊经历,对于我来说,串口这东西,仔细写起来,可以写一本书!应该不少于200页。

        2008年我刚进华为工作时,碰到了一个特殊的历史时期,嵌入式领域群雄逐鹿。

1、Intel、AMD高调宣称X86系统进入嵌入式领域,要占领PowerPC的市场。(后来Intel也做到了,通用服务器占领了几乎所有电信核心侧的设备——刀片服务器、机架服务器)。

2、当时,MIPS、ARM、PowerPC还难分伯仲,不过多核ARM不成熟,无法在电信领域广泛应用。MIPS由于其优异的性价比和高性能展露头角,慢慢由于其较差的质量表现而偃旗息鼓。

3、PowerPC,随着来着其他处理器的压力,也开始推出多核处理器。

        我当时的工作是参与X86处理器作为嵌入式的电路开发。当时碰到一个问题:传统X86作为PC机已经演进得非常成熟的架构。PC的硬件结构与嵌入式SoC有很大的区别。

CPU下面是北桥负责高速外设、北桥的南面(下面)是南桥负责低速接口外设、然后还有一个SIO负责更低速的外设。

SIO全称叫Super  I/O。

超级输入输出芯片(SIO)一般位于主板左下方或者左上方。主要使用的芯片有Winbond、ITE,它为主板上的标准I/O接口提供控制处理功能。这里所说的“超级”是指它集成了PS/2键盘、PS/2鼠标、串口COM、并口LPT接口等处理功能,而这些接口都是计算机中的慢速I/O设备。它们全部位于主板后部右边。它的主要功能包括负责处理从键盘、鼠标、串行接口等设备传输来的串行数据,将它们转换成为并行数据,同时也负责并行接口、软驱接口数据的传输与处理。SuperIO是通过一个类似于精简的PCI总线,叫做LPC总线与南桥进行连接的。

如此复杂的硬件结构,也是因为Intel强大的发货量,形成自有体系和标准。

所以在传统的PC机的主板上带一个RS232串口的,都是通过SuperIO实现的。X86上也是通过固定的地址去访问

而我们熟悉的ARM、不管是Cortex-M、还是Cortex-A都是一颗MCU、CPU都带了串口——UART;

从iBox选择的STM32F103的MCU的结构框图上面,我们可以看到有一堆UART、USART。

然而,在我当时面对的嵌入式X86的系统的设计需求,不需要并口、PS2、硬件监控、FDC、

H/W Monitor:一个应用程序读出所有计算机访问硬件传感器的测量值。

FDC:提供了一个主处理器和软驱之间的接口(软驱——看懂的人暴露年龄了)

Parallel port:并行端口(SPP),双向并行端口(BPP),增强型并行端口(EPP),扩展功能并行端口(ECP)四种模式。通过DIR可以控制它的输入/输出模式

认识上图的人再次暴露年龄

KBC:电路提供的功能包括一个键盘和一个PS2鼠标。控制器从键盘和鼠标接受串行数据,检查校验后将这些数据输出到其输出缓冲区。从它的读写命令中可以了解一些基本设置。

UART:终于说到我们的本文的主角UART、即串口了。在老式的台式电脑或者笔记本上,其实都会有RS232电平标准的UART:

关于串口的各种电平标准,我们前期有发布过相关的内容:

UART、RS-232、RS-422、RS-485

SuperIO的UART输出的一般也是TTL电平,还需要接到RS232芯片,再接到DB9接口

X86系统的地址的寻址空间还有点复杂:除了内存空间(Memory)、还有IO空间。详细内容点击:

处理器系列(7)——寻址空间

IO空间是

在X86开发时,串口这些低速的外设是用IO空间进行访问和读写的:

由UARTDevice Configuration Registers可知,UART1~UART4的基址分别是03F8H,02F8H,03E8H,02E8H。
 

GPIO:通用管脚

ACPI:ACPI是控制电脑电源的系统

这些对于传统的由PowerPC实现的电信嵌入式系统来说,除了串口,其他功能不是需要的;同时,原来的一些NorFlash、寄存器、传感器 数据,需要通过MPI接口进行访问,而这些都是SuperIO芯片不能实现的。

另外由于SuperIO的功能多,所以尺寸大,管脚也多。

所以在当时的设计需求里面,使用一个SuperIO并不合适。所以选择一个CPLD实现LPC接口控制UART接口。

由于我是从事过这么一个工作,所以对UART的工作过程特别熟悉。而且,我们一开始按照自己的想法,自定义了很多寄存器,并且地址是按照自己想法去设计的,结果:商业软件windows、商用linux无法直接识别到串口。后来又改回基址:03F8H,02F8H,03E8H,02E8H这几个地址。

二、串口的工作原理

1、我们用打电话为例,来说明串口的工作原理:

首先打电话,说话是串行,即:一个字一个字说。

发送方对接收方发送信息,是串行的:

因为对方是一个字发音、一个字发音听到的,所以每个字是按照时间先后顺序发给对方的。

如果我们用GPIO去传递信号,则我们只能传递“高低电平”,信号要么为“高电平”、要么为“低电平”。那么这个管脚传递信息,只有两个状态,跟烽火台一样,要么“有”、要么“没”。

所以当我们用GPIO进行点灯的时候,表示状态的时候,一般就是两个状态,“亮”、“灭”。

但是两个状态、根本没法满足我们传递信息的需求。于是我们希望传递,一串“亮”、“灭”,来传递更复杂的信息,跟电报、或者海军信号灯的原理是一样的。

2、串行的数据,如何转并行?

如同打电话一样,我们要听完一句话,接收所有的字、然后组词、组成句子,接收完整的一句话,之后人脑去理解他的语意。

学过《数字电路》的朋友,应该还记得“移位寄存器”吧?

细节,我估计你们早忘光了,甚至当时完全就没学会。。。。后来工作,好像也没用得到。(现在做硬件好像就是原理图PCB画对了就好了,都不用管电路原理。)

大致的意思是:

初始状态: 设A3A2A1A0= 1011

然后Q3的输出,是在每个时钟节拍,按照这个先后顺序,把A3A2A1A0串行的输出出去。

其实利用的就是D触发器的特性。

如果我们使用8位的移位寄存器,就可以利用8个clk的时间,发一组8bit的数据通过一跟导线,传输出去。

接收也是一样的,不过过程相反:

3、喂!XXXX   拜拜

打电话的时候,我们一般会先说:“喂!”。

这是一个信号,通知对方:“我要开始说话了”。

因为打电话的时候,我们彼此看不到对方,不知道对方的表情、眼神、动作、是否听你说话。所以我们通过一个信息,通知对方,启动通信。

在串口的通信过程中,一样的,我们需要通知对方:我要开始通信了。

其实很多接口原理都一样:首先要有个常态,然后再发一个不同的状态,告诉对方,开始了!

对于UART来说,首先要有个常态——高电平(至于为什么是高电平、各种说法,个人觉得应该没什么理由,反过来也不影响)

那么,我们就需要用一个信息告诉接收方,我要传数据了。最简单的方法就是,突然让电平拉低,这样,能够检测一个下降沿,或者能够检测到一个低电平,则,我们就可以认为,要开始了。

UART就选择了这么一个简单粗暴的方法:

上图,中Start,那个低电平,实际就是一个表示开始的信号。我们称之为:起始位。

同样,打电话的时候,我们都需要说:“再见”。

我跟我爸打电话的时候,我爸一般不说再见、拜拜之类的结束语,经常导致:我话还没说完,他就挂电话了。导致我要重新拨号过去。

这个“再见”,与平时,我们离开时说的“再见”,还多一层意思,表达:“通信可以停止了!”

所以,UART也需要这么一个信息,通知对方,我说完了,你可以处理了。

这个就是“停止位”,方式也很简单:“高电平”!

如上图中的STOP。

4、波特率——语速

因为,UART中的A表示的是异步:

(Universal Asynchronous Receiver/Transmitter)

所谓异步,也就是说,我给你发信号的时候,我不给你发时钟;

接收方,需要:

1、时钟与发送方时钟误差不能太大。

2、双方的分析数据的时钟需要保持基本一致。

例如:

发送方发出9600波特率信号,但是接收方的波特率设置为19200。起始位没有问题,因为能够接收到那个下降沿,低电平。所以,会去解析数据,但是会出现误码。我们在信号上分析一下就知道了:

白色的数字是9600波特率发出来的本意:01000001

结果,接收方波特率19200,是9600的两倍,采样的速率也是2倍,解析出来的数据:00011000

这样就造成“错误”。

这也是为什么,我们串口对接时,收发双方需要统一“波特率”的原因。

三、串口的电平标准

1、TTL

一般板内或者是,现在调试用的串口工具,直接使用TTL电平标准的UART,简单易用,成本低。缺点的是不能远距离传输。

2、RS-232标准

RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写,232为标识号。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。需要说明一下,很多人经常把RS-232、RS-422、RS-485 误称为通讯协议,这是很不应该的,其实它们仅是关于UART通讯的一个机械和电气接口标准(顶多是网络协议中的物理层面)。

该标准规定采用一个25 个脚的DB-25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。后来IBM的PC 机将RS-232 简化成了DB-9 连接器,从而成为今天的事实标准。而工业控制的RS-232 口一般只使用RXD(2)、TXD(3)、GND(5) 三条线。

 

早期由于PC都带有RS-232接口,所以我们需要使用UART时,都选择RS-232。但是现在个人电脑,不光是笔记本,包括台式机都不再带有RS-232的接口,大家看到电脑主板上面没有DB9的接口。所以现在开发板都选择TTL的UART,或者直接UART转USB做在开发板上。

   嵌入式里面说的串口,一般是指UART口, 但是我们经常搞不清楚它和COM口的区别,  以及RS232, TTL等关系,  实际上UART,COM指的物理接口形式(硬件), 而TTL、RS-232是指的电平标准(电信号).

      UART有4个pin(VCC, GND, RX, TX), 用的TTL电平,  低电平为0(0V),高电平为1(3.3V或以上)。

                                                                               

3、RS-485/ RS-422标准

RS-232接口可以实现点对点的通信方式,但这种方式不能实现联网功能。于是,为了解决这个问题,一个新的标准RS-485产生了。RS-485的数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B。 

通常情况下,发送驱动器A、B之间的正电平在+2~+6V,是一个逻辑状态,负电平在-2~6V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。

RS-422 的电气性能与RS-485完全一样。主要的区别在于:RS-422 有4 根信号线:两根发送、两根接收。由于RS-422 的收与发是分开的所以可以同时收和发(全双工),也正因为全双工要求收发要有单独的信道,所以RS-422适用于两个站之间通信,星型网、环网,不可用于总线网;RS-485 只有2 根信号线,所以只能工作在半双工模式,常用于总线网。

 

1. RS-485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

2. RS-485的数据最高传输速率为10Mbps 。

3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。

4. RS-485最大的通信距离约为1219M,最大传输速率为10Mb/S,传输速率与传输距离成反比,在100Kb/S的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

RS-423 非平衡串行通信接口

       结构、信号电平、传输距离、传输速率、接口芯片

RS-422 平衡型串行通信接口

       结构、信号电平、接口芯片,MC3486、MC3487、SN75154,SN75155

       传输速率、传输距离

RS-485 串行通信总线

       结构、信号电平、接口芯片 MAX485

       传输速率、传输距离,应用实例

 

由于RS-232 接口标准出现较早,难免有不足之处,主要有以下四点:

(1)  接口的信号电平值较高,易损坏接口电路芯片,又因为232电平与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接;

(2)  传输速率较低,在异步传输时,波特率为20Kbps。现在由于采用了新的UART芯片,波特率达到115.2Kbps(1.832M/16);

(3)  接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;

(4)  传输距离有限,最大传输距离标准值为50 米,实际上也只能用在15 米左右;

(5)  RS-232 只容许一对一的通信,没有考虑构成串行总线。(这点很重要,在很多控制场景,是一控多,如果主设备都需要跟从设备点对点通信,那现场布线成蜘蛛网了)

非平衡型串行通信接口RS-423,RS-449

平衡型串行通信接口RS-422

RS-422(EIA RS-422-A Standard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

 

4、RS-232与RS-485对比

1、抗干扰性:RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好。RS232 接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰。

2、传输距离:RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米。RS232 传输距离有限,最大传输距离标准值为 50 米,实际上也只能用在 15 米左右。

3、通信能力:RS-485 接口在总线上是允许连接多达128个收发器,用户可以利用单一的 RS-485 接口方便地建立起设备网络。RS-232只允许一对一通信。

4、传输速率:RS-232传输速率较低,在异步传输时,波特率为 20Kbps。RS-485 的数据最高传输速率为 10Mbps 。

5、信号线:RS485 接口组成的半双工网络,一般只需二根信号线。RS-232 口一般只使用 RXD、TXD、GND 三条线 。

6、电气电平值:RS-485的逻辑"1"以两线间的电压差为+(2-6) V 表示;逻辑"0"以两线间的电压差为-(2-6)V 表 示 。在 RS-232-C 中任何一条信号线的电压均为负逻辑关系。即:逻辑"1",-5- -15V;逻辑"0 " +5- +15V 。

5、RS-422与RS-485对比 

RS-485的电气性能与RS-422完全一样。主要的区别在于:

1、RS-422 有4 根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422 的收与发是分开的所以可以同时收和发(全双工)。

2、RS-485 只有两根数据线:发送和接收都是A 和B。由于RS-485 的收与发是共用两根线,所以不能同时收和发(半双工)。

RS-485标准采用平衡式发送,差分式接收的数据收发器来驱动总线,具体规格要求:

接收器的输入电阻RIN≥12kΩ

驱动器能输出±7V的共模电压

输入端的电容≤50pF

在节点数为32个,配置了120Ω的终端电阻的情况下,驱动器至少还能输出电压1.5V(终端电阻的大小与所用双绞线的参数有关)

接收器的输入灵敏度为200mV(即(V+)-(V-)≥0.2V,表示信号“0”;(V+)-(V-)≤-0.2V,表示信号“1”)

因为RS-485的远距离、多节点(32个)以及传输线成本低的特性,使得EIA RS-485成为工业应用中数据传输的首选标准。

(1)  RS-485 的电气特性:发送端:逻辑“0”以两线间的电压差+(2 ~6)V 表示;逻辑“1”以两线间的电压差-(2 ~6)V 表示。接收端:A 比B 高200mV 以上即认为是逻辑“0”,A 比B 低200mV 以上即认为是逻辑“1”;

(2)  RS-485 的数据最高传输速率为10Mbps。但是由于RS-485 常常要与PC 机的RS-232 口通信,所以实际上一般最高115.2Kbps。又由于太高的速率会使RS-485 传输距离减小,所以往往为9600bps 左右或以下;

(3)  RS-485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好;

(4)  RS-485 接口的最大传输距离标准为1200 米(9600bps 时),实际上可达3000米,RS-485 接口在总线上是容许连接多达128 个收发器、即RS-485 具有多机通信功能,这样用户可以利用单一的RS-485 接口方便的建立起网络。因为RS-485 接口组成的半双工网络,一般只需二根信号线,所以RS-485 接口均采用双绞线传输。RS-485 的国际标准并没有规定RS-485 的接口连接器标准、所以采用接线端子或者DB-9、DB-25 等连接器都可以。

在使用RS-485 接口时,对于特定的传输线径,从发生器到负载其数据信号传输所容许的最大电缆长度是数据信号速率的函数,这个长度数据主要是受信号失真及噪声等影响所限制。最大电缆长度与信号速率的关系曲线是使用24AWG 铜芯双绞电话电缆(线径为0.51mm),线间旁路电容为52.5PF/M,终端负载电阻为100 欧时所得出的。(引自GB11014-89 附录A)。当数据信号速率降低到90Kbit/S 以下时,假定最大容许的信号损失为6dBV 时,则电缆长度被限制在1200m。实际上,在使用时是完全可以取得比它大的电缆长度。当使用不同线径的电缆,则取得的最大电缆长度是不相同的。例如:当数据信号速率为600Kbit/S 时,采用24AWG 电缆,最大电缆长度是200m,若采用19AWG电缆(线径为0.91mm)则电缆长度将可以大于200m;若采用28AWG 电缆(线径为0.32mm),则电缆长度只能小于200m。

RS-485的远距离通信建议采用屏蔽电缆,并且将屏蔽层作为地线。

 

6、影响RS-485总线通讯速度和通信可靠性的三个因素

 在通信电缆中的信号反射

在通信过程中,有两种信号因素导致信号反射:阻抗不连续和阻抗不匹配。

阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射,如图所示。这种信号反射的原理,与光从一种媒质进入另一种媒质要引起反射是相似的。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。

从理论上分析,在传输电缆的末端只要跨接了与电缆特性阻抗相匹配的终端电阻,就再也不会出现信号反射现象。但是,在实现应用中,由于传输电缆的特性阻抗与通讯波特率等应用环境有关,特性阻抗不可能与终端电阻完全相等,因此或多或少的信号反射还会存在。

引起信号反射的另一个原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。

信号反射对数据传输的影响,归根结底是因为反射信号触发了接收器输入端的比较器,使接收器收到了错误的信号,导致CRC校验错误或整个数据帧错误。

在信号分析,衡量反射信号强度的参数是RAF(Refection AttenuationFactor反射衰减因子)。它的计算公式如式(1)。

RAF=20lg(Vref/Vinc) (1)

式中:Vref—反射信号的电压大小;Vinc—在电缆与收发器或终端电阻连接点的入射信号的电压大小。

具体的测量方法如图3所示。例如,由实验测得2.5MHz的入射信号正弦波的峰-峰值为+5V,反射信号的峰-峰值为+0.297V,则该通讯电缆在2.5MHz的通讯速率时,它的反射衰减因子为:

RAF=20lg(0.297/2.5)=-24.52dB

要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。在通讯线路中,如何通过加偏置电阻提高通讯可靠性的原理。

    在通讯电缆中的信号衰减

第二个影响信号传输的因素是信号在电缆的传输过程中衰减。一条传输电缆可以把它看成由分布电容、分布电感和电阻联合组成的等效电路,如图所示。

电缆的分布电容C主要是由双绞线的两条平行导线产生。导线的电阻在这里对信号的影响很小,可以忽略不计。信号的损失主要是由于电缆的分布电容和分布电感组成的LC低通滤波器。PROFIBUS用的LAN标准型二芯电缆(西门子为DP总线选用的标准电缆),在不同波特率时的衰减系数如表1所示。

电缆的衰减系数

  在通讯电缆中的纯阻负载

影响通讯性能的第三个因素是纯阻性负载(也叫直流负载)的大小。这里指的纯阻性负载主要由终端电阻、偏置电阻和RS-485收发器三者构成。

在叙述EIA RS-485规范时曾提到过RS-485驱动器在带了32个节点,配置了150Ω终端电阻的情况下,至少能输出1.5V的差分电压。一个接收器的输入电阻为12kΩ,整个网络的等效电路如图5所示。按这样计算,RS-485驱动器的负载能力为:

RL=32个输入电阻并联2个终端电阻=((12000/32)×(150/2))/(12000/32)+(150/2))≈51.7Ω

现在比较常用的RS-485驱动器有MAX485、DS3695、MAX1488/1489以及和利时公司使用的SN75176A/D等,其中有的RS-485驱动器负载能力可以达到20Ω。在不考虑其它诸多因素的情况下,按照驱动能力和负载的关系计算,一个驱动器可带节点的最大数量将远远大于32个。

在通讯波特率比较高的时候,在线路上偏置电阻是很有必要的。偏置电阻的连接方法如图6。它的作用是在线路进入空闲状态后,把总线上没有数据时(空闲方式)的电平拉离0电平,如图7。这样一来,即使线路中出现了比较小的反射信号或干扰,挂接在总线上的数据接收器也不会由于这些信号的到来而产生误动作。

通过下面后例子了,可以计算出偏置电阻的大小:

终端电阻Rt1=Rr2=120Ω;

假设反射信号最大的峰-峰值Vref≤0.3Vp-p,则负半周的电压Vref≤0.15V;终端的电阻上由反射信号引起的反射电流Iref≤0.15/(120||120)=2.5mA。一般RS-485收发器(包括SN75176)的滞后电压值(hysteresis value)为50mV,即:

(Ibias-Iref)×(Rt1||Rt2)≥50mV

于是可以计算出偏置电阻产生的偏置电流Ibias≥3.33mA

+5V=Ibias(R上拉+R下拉+(Rt1||Rt2)) (2)

通过式2可以计算出R上拉=R下拉=720Ω

在实际应用中,RS-485总线加偏置电阻有两种方法:

(1)把偏置电阻平衡分配给总线上的每一个收发器。这种方法给挂接在RS-485总线上的每一个收发器加了偏置电阻,给每一个收发器都加了一个偏置电压。

(2)在一段总线上只用一对偏置电阻。这种方法对总线上存在大的反射信号或干扰信号比较有效。值得注意的是偏置电阻的加入,增加了总线的负载。

 7、RS-485总线的负载能力和通讯电缆长度之间的关系

在设计RS-485总线组成的网络配置(总线长度和带负载个数)时,应该考虑到三个参数:纯阻性负载、信号衰减和噪声容限。纯阻性负载、信号衰减这两个参数,在前面已经讨论过,现在要讨论的是噪声容限(Noise Margin)。RS-485总线接收器的噪声容限至少应该大于200mV。前面的论述者是在假设噪声容限为0的情况下进行的。在实际应用中,为了提高总线的抗干扰能力,总希望系统的噪声容限比EIA RS-485标准中规定的好一些。从下面的公式能看出总线带负载的多少和通讯电缆长度之间的关系:

Vend=0.8(Vdriver-Vloss-Vnoise-Vbias)(3)

其中:Vend为总线末端的信号电压,在标准测定时规定为0.2V;Vdriver为驱动器的输出电压(与负载数有关。负载数在5~35个之间,Vdriver=2.4V;当负载数小于5,Vdriver=2.5V;当负载数大于35,Vdriver≤2.3V);Vloss为信号在总线中的传输过程中的损耗(与通讯电缆的规格和长度有关),由表1提供的标准电缆的衰减系数,根据公式衰减系数b=20lg(Vout/Vin)可以计算出Vloss=Vin-Vout=0.6V(注:通讯波特率为9.6kbps,电缆长度1km,如果特率增加,Vloss会相应增大);Vnoise为噪声容限,在标准测定时规定为0.1V;Vbias是由偏置电阻提供的偏置电压(典型值为0.4V)。

式(3)中乘以0.8是为了使通信电缆不进入满载状态。从式(3)可以看出,Vdriver的大小和总线上带负载数的多少成反比,Vloss的大小和总线长度成反比,其他几个参数只和用的驱动器类型有关。因此,在选定了驱动器的RS-495总线上,在通信波特率一定的情况下,带负载数的多少,与信号能传输的最大距离是直接相关的。具体关系是:在总线允许的范围内,带负载数越多,信号能传输的距离就越小;带负载数据少,信号能传输的距离就越远。

8、分布电容对RS-485总线传输性能的影响

电缆的分布电容主是由双绞线的两条平行导线产生。另外,导线和地之间也存在分布电容,虽然很小,但在分析时也不能忽视。分布电容对总线传输性能的影响,主要是因为总线上传输的是基波信号,信号的表达方式只有“1”和“0”。在特殊的字节中,例如0x01,信号“0”使得分布电容有足够的充电时间,而信号“1”到来时,由于分布电容中的电荷,来不及放电,(Vin+)—(Vin-)-还大于200mV,结果使接收误认为是“0”,而最终导致CRC校验错误,整个数据帧传输错误。具体过程如图所示。

由于总线上分布影响,导致数据传输错误,从而使整个网络性能降低。解决这个问题有两种方法:

(1)降低数据传输的波特率;

(2)使用分布电容小的电缆,提高传输线的质量。

仅仅用一对双绞线将各个接口的A、B端连接起来,而不对RS-485通信链路的信号接地,在某些情况下也可以工作,但给系统埋下了隐患。RS-485接口采用差分方式传输信号并不需要对于某个参照点来检测信号系统,只需检测两线之间的电位差就可以了。但应该注意的是收发器只有在共模电压不超出一定范围(-7V至+12V)的条件下才能正常工作。当共模电压超出此范围,就会影响通信的可靠直至损坏接口。如图1所示,当发送器A向接收器B发送数据时,发送器A的输出共模电压为VOS,由于两个系统具有各自独立的接地系统存在着地电位差VGPD,那么接收器输入端的共模电压就会达到VCM=VOS+VGPD。RS-485标准规定VOS≤3V,但VGPD可能会有很大幅度(十几伏甚至数十伏),并可能伴有强干扰信号致使接收器共模输入VCM超出正常围,在信号线上产生干扰电流影响正常通信,或损坏设备。

四、串口线的传输距离

串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

总述:

串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式。

同步串行是指SPI(Serial Peripheral interface)的缩写,顾名思义就是串行外围设备接口。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,TRM450是SPI接口。

异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART是一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含TTL电平的串口和RS232电平的串口。TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。

串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。

RS-232:

也称标准串口,最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座(DB25),后来使用简化为9芯D型插座(DB9),现在应用中25芯插头座已很少采用。

RS-232采取不平衡传输方式,即所谓单端通讯。由于其发送电平与接收电平的差仅为2V至3V左右,所以其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的通信。

pt; background:rgb(255,255,255); mso-shading:rgb(255,255,255); " >、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。

RS-422

标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。典型的RS-422是四线接口。实际上还有一根信号地线,共5根线。其DB9连接器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。

RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

RS-485

是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。

RS-485与RS-422的不同还在于其共模输出电压是不同的,RS-485是-7V至+12V之间,而RS-422在-7V至+7V之间,RS-485接收器最小输入阻抗为12kΩ、RS-422是4kΩ;由于RS-485满足所有RS-422的规范,所以RS-485的驱动器可以在RS-422网络中应用。

RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。

nt face="Arial" >1219米,最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UART串口 的相关文章

  • 串口通讯UART/RS232/RS485/RS-422笔记

    串口通讯详解笔记 串口通讯概述串口通讯传输数据帧的结构UARTRS232RS485RS 422RS 232 RS 422和RS 485的主要区别 xff08 重要 xff09 串口通讯概述 串口通讯是指数据按位 xff08 bit xff0
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • FPGA学习-UART串口发送单字节(UART时序分析+真正的FPGA设计看图写代码)

    首先看UART发送时序图 xff1a 要发送一个完整字节 xff0c 需要 1位起始位 43 8位数据位 43 1位停止位 xff0c 图上的第11位 xff0c 是确认一个字节发送完的一位 重点是每一位之间的发送时间需要保持一致 xff0
  • 【FPGA】UART串口通信

    文章目录 一 通信方式1 串行通信2 并行通信 二 UART串口通信1 模块设计与时序图2 代码实现 三 测试结果1 仿真结果2 上板验证 一 通信方式 1 串行通信 串行通信是指利用一条传输线将数据一位位地顺序传送 xff08 也就是说串
  • Jetson Nano – UART

    There is a UART on the J41 GPIO Header of the NVIDIA Jetson Nano Developer Kit Useful when you need a little bit of extr
  • WK2114(一个异步串口UART 扩展为4个串口UART)

    WK2114是UART接口的4通道UART器件 WK2114将一个标准3线异步串口 xff08 UART xff09 扩展成为4个增强 功能串口 xff08 UART xff09 主接口UART在数据传输时主接口的UART可以通过引脚配置为
  • 收藏!了解UART总线工作原理看这一篇就够了!

    原文 xff1a 玩转单片机 2019 08 24 16 50 29 越学到后面 xff0c 基础知识更加不能忘记 xff0c 温故而知新 还记得当年的打印机 xff0c 鼠标和调制解调器吗 xff1f 他们都有巨大笨重的连接器和粗电缆 x
  • UART&RS232&RS485的区别

    UART RS232 RS485在串口通信中 xff0c 主要区别是电平的不同 xff0c 其中UART通常使用TTL电平 TTL TTL全名是晶体管 晶体管逻辑集成电路 Transistor Transistor Logic 输入高电平最
  • UART(通用异步收发传输器)

    1 UART其在数据发送时将并行数据转换成串行数据来传输 xff0c 在数据接收时将接收到的 串行数据转换成并行数据 是异步串行通信的总称 2 而 RS232 RS449 RS423 RS422 和 RS485 等是对应各种异步串行通信口的
  • arduino学习——UART串口通信

    Serial begin 初始化串口 用作串口的启动 xff0c 常放置在setup xff08 xff09 中 原型 xff1a Serial begin speed Serial begin speed config 参数 xff1a
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • UART串口通信协议概述

    1 UART协议介绍 UART是一种通用串行数据总线 xff0c 用于异步通信 UART能实现双向通信 xff0c 在嵌入式设计中 xff0c 常用于主机与辅助设备通信 UART包括RS232 RS449 RS423等接口标准规范和总线标准
  • RT-Thread记录(十一、I/O 设备模型之UART设备 — 源码解析)

    深入理解 RT Thread I O 设备模型 分析 UART设备源码 目录 前言 一 初识 UART 操作函数 应用程序 二 UART 的初始化 2 1 UART 设备初始化位置 2 2 UART 设备初始化函数分析 stm32 uart
  • Node.js笔记:SerialPort(串口)模块使用(基于9.x.x)

    文章目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯 Node js中可以使
  • 51单片机串口通信(UART)

    项目描述 1 串口工作方式为1 8位UART 波特率可变 无校验位 2 通信数据格式为 1位起始位 8位数据位 1位停止位 3 上电后MCU给上位机发送问候语 之后等待上位机的信息 MCU和上位机的通信为收发交替进行 MCU接收到的信息会实
  • mega328p-ADC,PWM,UART驱动

    ADC驱动 函 数 名 Ai Init 函数功能 Ai端口初始化 输入参数 void 输出参数 void 返 回 值 void 参考文档 void 创 件 人 程强刚 创建日期 2016 02 09 修改历史 void Ai Init vo
  • 【UART】Verilog实现UART接收和发送模块

    目录 写在前面 UART 工作原理 UART 接收部分 UART RX 模块图 UART RX 时序图 Verilog 实现 UART RX 模块 UART 发送部分 UART TX 模块图 UART TX 时序图 Verilog 实现 U
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过

随机推荐

  • ADS(ARM Developer Suite)安装与卸载中的问题(转)

    ADS用来对ARM的裸机代码进行编辑和调试 我在安装ADS1 2的过程中 xff0c 遇到了一个小问题 xff0c 写下来和大家分享一下解决方法 1 在安装程序 xff0c 进度条到100 时 xff0c 会一直停在那 xff0c 十几分钟
  • ucosIII 学习资料汇总

    网站 书籍 1 嵌入式实时操作系统uc OS III 邵贝贝译 这本书其实就是一本工具书 xff0c 我参考了官方的说明文档 xff0c 发现雷同很高 感觉就是官方说明文档翻译的 xff0c 用来应用查查接口还有点用 xff0c 不是十分推
  • USB协议传输结构

    USB作为数据通信标准 xff0c 固件可分为枚举配置和类协议部分 xff0c 枚举配置实现USB主机对设备的枚举和配置 xff0c 类协议实现设备各自的数据传输 usb2 0协议chapter8 protocol layer 1 USB协
  • 蓝牙HCI协议

    HCI 层位于蓝牙高层协议和低层协议之间 xff0c 提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口 它是我们实现自己的蓝牙设备要接触的第一个蓝牙协议 起着承上启下的作用 HCI通过包的方式来传送数据 命令和事件的 xff0
  • 标准USB设备请求命令

    一 标准的usb设备请求命令 控制传输是最重要和结构最复杂的一种传输类型 控制传输的 初始设置步骤 中包含了1 个8 字节的DATA0 数据包 参见图6 6 这8 字节的数据包是主机用来发送控制阶段中的请求命令的 而这些请求命令是主机配置U
  • 卡尔曼滤波基本公式推导(高斯乘积法)

    前言 卡尔曼滤波的推导这里给出两种推导方法 xff1a 一种是利用高斯乘积定理和贝叶斯公式推导出来 的 xff0c 另一种借用的是最小误差的思想 xff08 IMSE xff09 关于卡尔曼滤波的应用场景以及通俗的解释 xff0c 我相信各
  • 计算机组成原理(唐朔飞)

    计算机组成原理 唐朔飞 存储器 存储器分类 存储介质分类 半导体存储器磁表面存储器磁芯存储器 淘汰 存储方式 存储结构 存储器容量 地址总线 xff1a CPU能访问的地址宽度 xff0c 32地址线表示能访问2的32次方个存储单元地址 数
  • ubuntu配置静态IP、DNS地址

    虚拟机需要使用桥接上网 1 ifconfig 查看网卡信息 2 vi etc network interfaces 打开并编辑配置文件 配置说明 xff1a auto lo iface lo inet loopback auto ens33
  • c调用libcurl库发送GET 和 POST请求

    libcrul请求的基本套路流程 1 调用curl global init 初始化libcurl2 调用curl easy init 函数得到 easy interface型指针3 调用curl easy setopt 设置传输选项4 根据
  • LINUX 操作GPIO口

    两种方法 1 写驱动的方式 缺 2 通过linux提供的用户空间 终端控制 通过在用户空间上来操作GPIO xff0c 控制入口在 xff1a sys class gpio 首先确认内核里是否已选择上gpiolib的sysfs接口功能 默认
  • V4L2简介

    http work blog readthedocs org en latest v4l2 20intro html 第一章 V4L2简介 1 1 什么是v4l2 V4L2 xff08 Video4Linux的缩写 xff09 是Linux
  • 电子设计项目

    全套完整毕业设计智能家居控制系统设计 16X16点阵滚动显示 单片机595 43 138LED点阵 基于WIFI传输的单片机传感器设计 xff08 毕业论文 xff09 基于单片机设计的多点测温系统 数码管显示温度 基于单片机设计的公交报站
  • 视觉惯导里程计VIO综述

    最近阅读了VIO中的一些论文 xff0c 在这里做个汇总方便以后查阅 xff0c 如有问题欢迎指正 一 背景 VIO xff08 Visual Inertial Odometry xff09 视觉惯导里程计 xff0c VINS xff08
  • 【Cocos2d-X-2.1.4游戏引擎】发布第一个游戏

    有一段时间没更新博客了 xff0c 最近一直在写一个小游戏 xff0c 游戏在今天终于搞好了 xff0c 又可以开始写写博客 xff0c 打打dota的悠闲的日子了哈 看了十几天cocos2d x后 xff0c 也依照官网的例子写了个打飞机
  • 游戏升级之路

    七十一雾央原创 转载请注明 http blog csdn net hust xy 楼主学习编程有两年了 xff0c 决定向游戏发展大概就是半年前了 xff0c 在这里总结一下游戏方面的学习经历过 xff0c 给初学的朋友们参考下 xff0c
  • Nmap安装和使用详解

    文章目录 Nmap概述功能概述运行方式 Nmap安装Nmap参数详解目标说明主机发现端口扫描端口说明和扫描顺序服务与版本探测脚本扫描操作系统探测时间和性能防火墙 IDS规避和欺骗输出选项使用示例 常用扫描命令扫描ip地址或域名扫描整个网段扫
  • MSCKF_VIO:MSCKF的双目版本

    论文 xff1a MSCKF的双目版本 Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight 下载地址 xff1a 点击 源码地址 xff1a https git
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • C++ sdk 获取执行文件所在路径

    TCHAR szFilePath MAX PATH 43 1 61 0 GetModuleFileName NULL szFilePath MAX PATH tcsrchr szFilePath T 39 39 1 61 0 szFileP
  • UART串口

    一 串口的历史 首先 xff0c 串口对每一个做硬件和嵌入式软件的人来说 xff0c 就是一个必备的工具 xff0c 调试一个带MCU或者CPU的系统 我们在调试的过程中 xff0c 一般第一件事情 xff1a GPIO点灯 xff0c 第