• 发文
  • 评论
  • 微博
  • 空间
  • 微信

嵌入式硬件通信接口协议-UART(一)协议基础

掘芯 2018-12-17 09:19 发文

一、   简介

UART,全称UniversalAsynchrONous Receiver/Transmitter,译为通用异步收发器。

 

串口的出现是在1980年前后,数据传输率是115kbps~230kbps。串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。串口也可以应用于两台计算机(或设备)之间的互联及数据传输。由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已开始取消该接口。目前串口多用于工控和测量设备以及部分通信设备中。

在几乎所有的MCU中都会有UART接口。

--from 百度百科串行接口

 

 

每当口中提到“串口”,很容易让人想到的名词有UART、USART、COM口、TTL/CMOS、RS-232、RS-422、RS-485。其中:

UART,“串口”时序协议的名称,定义了各个信号时序协议;

USART,相比UART增加了同步信号,可实现ISO-7816智能卡接口;

COM口,在PC等操作系统上,区别于USB、SATA接口的串行接口,定义了在操作系统中的规范;

TTL/CMOS,嵌入式硬件系统的信号电平;

RS-232,在UART基础上再定义了信号的电气特性

RS-422,在RS-232基础上定义了差分信号传输的电气特性

RS-485,在RS-422基础上定义了半双工模式

 

二、   信号线

信号线的命名,都是基于当前终端设备而定义的。

UART常用的信号线有:

RxD,当前终端设备的接收管脚

TxD,当前终端设备的发送管脚

GND,当前终端设备的地

 

如上所述,信号线的命名基于当前终端设备而做的标记,在手工接线时,可以快速判断连接的线序。

一般的,设计者在设计PCB时,对外连接做的一些预留接口,标记接口管脚时,都会添加丝印标记,这时标记的都是当前终端设备的管脚信息。

例如标记着RxD的引脚,应该与外部的UART接口TxD连接。

     

                      

 

三、   信号时序

信号线空闲时,处于高电平,当有数据发送时,信号线以1个bit时长的低电平标志开始通信,通信过程中,单个字节在信号线上的帧结构如下图:


信号管脚传输每个数据时,在管脚上呈现的是电气信号为高低电平的变化,对应数据每个bit的逻辑“1”和“0”。

组成UART帧结构时,附带的起始位、停止位,实现了对传输数据流每个字节的界定,该过程实现了起始式协议。同时在停止位前可选择地插入校验位,实现了对数据帧正确性的校验。

         如下图是常见的UART通信过程中使用的配置参数8-N-1对应的时序:


配置参数(8-N-1):8bit数据、无校验位、1bit停止位

 

四、   接口配置项

在启用UART接口时,需要通信双方对接口进行相同参数的配置,才能够正确通信。而UART可配置的参数有:

(一)         波特率Baudrate:

由于UART属于异步通信,在通信过程中没有同步时钟CLK来提供给接收方,接收方也就无法同步地确定每个bit的宽度,也就无法对每个bit进行正确的采样。因此接收方必须依靠设置与发送方相同的波特率参数,这样接收方对信号管脚进行采样和解码时,才能正确判断每个bit的值是“1”还是“0”,这也就是异步通信的特点。

在各类MCU的UART配置中,常用的波特率值有:

4800Bd、9600Bd、19200Bd、115200Bd,单位Bd。常见有如下代码截图:



要想理解波特率,来的维基百科中查询一番


在维基百科的介绍中,可看到,波特率的值,直接以bit/s的单位取倒数后得到单位s/bit,同时在示波器端对UART发出的波形进行抓取,可见每bit的宽度在误差允许范围内基本就是波特率的倒数值。

 

在百度百科的词条《波特》介绍中,波特率是指:

调制速率,指的是有效数据信号调制载波的速率,即单位时间内载波调制状态变化的次数。它是对符号传输速率的一种度量,1波特即指每秒传输1个符号,而通过不同的调制方式,可以在一个码元符号上负载多个bit位信息。 单位“波特”本身就已经是代表每秒的调制数,以“波特每秒”(Baud per second)为单位是一种常见的错误。

它代表的是信号的变化,而不是传输数据的多少。它表示每秒钟内通信线路状态改变的次数。如果数据不压缩,波特等于每秒钟传输的数据位数,如果数据进行了压缩。那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒有时会产生错误。

        

但是在现代的实际使用中,多数情况下,配置了MCU的波特率后,对输出信号进行观测发现,此时波特率等于比特率。也正是因为此时传输的符号即8bit一个Byte的数据量,从而波特率等于比特率。

如果拿到一块板子或者一套设备,但没有源码程序,纯靠硬件抓取通信串口的数据内容,首先利用示波器观测每个bit的宽度,后换算成比特率,这时候比特率基本上就是波特率了。利用串口助手模块,在PC端下载个串口助手,设置匹配的波特率进行数据抓取。

比如抓到波形116us/bit, 直接转换得:1bit/116us = 1 bit/(116/1000000)s = 8620.68 bit/s,此时配置串口助手的波特率,利用串口助手模块与被测信号管脚进行连接,即可实现串口数据的抓取。

 

 

(二)         数据位Data bits:

在维基百科的介绍中,数据的位数一般可有5~9位,其中各个位数的应用场景也是有区别的:

5位常用于博多码(Baudot code)

7位常用于ASCII字符

8位则用于大多数类型的数据并且与字节(Byte)匹配

6位9位少用

收发双方定义了相同的数据位宽后,才能对信号管脚采样时正确解码到传输的数据内容。

如上列出的不同数据位数情况,在不同的应用场景中,能够选择合适的数据完成高效率的传输。


(三)         校验位Parity:

校验位可在数据传输过程中,接收方对信号管脚进行采样和解码时,对数据的完整性正确性进行校验,保证在通信过程中,可有效排除线路不稳定或者外界的干扰导致数据位出错的问题。

         校验位作为可选的配置项,可进行的配置方式有:

配置方式

作用

备注

None

无校验

在数据传输的帧结构中没有校验位

Odd

奇校验

数据中”1”的个数是奇数,校验位被置0;

数据中”1”的个数是偶数,校验位被置1。

Even

偶校验

数据中”1”的个数是奇数,校验位被置1;

数据中”1”的个数是偶数,校验位被置0。

Mark

校验位始终是“1”

校验位始终是“1”

Space

校验位始终是“0”

校验位始终是“0”

         对于奇偶校验位的设置,比较容易混淆的是奇校验和偶校验的设定,在下图中分别列出了所有校验位配置方式的时序图,其中传输的数据是DigCore的缩写DC,即十六进制为0xDC:

         对比观察上图中的各类校验方式,简单说奇校验(Odd-Parity)方式,传输的数据0xDC,二进制11011100,从二进制数值看到有5个“1”,也就是奇数个“1”,则在校验位被置“0”,此时逻辑“1”的个数总和等于奇数5,从而实现奇校验。

简而言之,保证一个原则是,开启奇校验时,数据中“1”的个数与校验位“1”数量总和为奇数,开启偶校验时,该数量总和为偶数。

 

 

(四)         停止位Stop bits:

停止位可配置成1bit、1.5bit和2bit三种,配置成其中一种的时候,信号管脚的电平保持对应bit时长的高电平。

停止位的意义在于标志着一个数据的发送完成,同时保证了收发双方在进行硬件操作的时候,提供了可靠的处理时间。

(五)         流控制Flow control:

流控制,俗话说就是“握手”。流控制的作用,在不同处理性能的设备之间,数据传输之前,接收方会以“流控制”来通知发送方,是否可以继续进行接下来的数据传输。这样的应用场景多见于计算机与低性能的微控制器通信,也可见于PC与打印机之间进行的数据传输,该特点都是接收方的接收缓存已满或处理事务较慢时,从而需要流控制来告知发送方稍后再发送。

流控制的方式分别有软件和硬件两种。

软件的流控制方式,在UART通信中,只需RxD、TxD、GND三根即可,数据在传输过程中,依靠代码的判断处理,并通过收发双方进行的数据交互完成控制,在现有通信物理信号线基础上,使用控制字符(ASCII表中的0x00~0x0x1F、0x7F)完成控制指令的交互。一般在私有协议下也会定义一些特殊字符设为控制指令。

硬件的流控制方式,即在原有的RxD、TxD、GND三根信号线的基础上,再增加RTS/CTS和DTR/DSR这两组信号线。

第一组线是RTS(Request toSend)和CTS(Clear toSend)。当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。

第二组线是DTR(DataTerminal Ready)和DSR(Data SetReady)。这些线主要用于Modem通信。使得串口和Modem通信他们的状态。

例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。读取DSR线置高,PC机开始发送数据。一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。

而在实际的应用中,硬件的方式比较少用,最大的原因是消耗硬件成本,并且在当前的MCU性能下,UART的FIFO缓存器、MCU的UART事件中断等等因素,都能够完成数据的接收和存储,并且对大多数的应用场景是完全足够,因此在很多应用中已经很少用到硬件流控制。


信号

定义

作用

DTR

数据终端准备好

Data Terminal Ready

DSR

数据准备好

Data Set Ready

RTS

请求发送

Request To Send

CTS

清除发送

Clear To Send


 

 

文章到此已经完成了对UART协议基础的描述,欲知UART的不同电气特性下的接口规范,且听下回分解!

 

 

参考资料:

《串行接口》@百度百科

《Serial Port》@维基百科

《波特》@百度百科


声明:本文为OFweek维科号作者发布,不代表OFweek维科号立场。如有侵权或其他问题,请及时联系我们举报。
2
评论

评论

    相关阅读

    暂无数据

    掘芯

    由浅入深挖掘芯片可用资源,在有限...

    举报文章问题

    ×
    • 营销广告
    • 重复、旧闻
    • 格式问题
    • 低俗
    • 标题夸张
    • 与事实不符
    • 疑似抄袭
    • 我有话要说
    确定 取消

    举报评论问题

    ×
    • 淫秽色情
    • 营销广告
    • 恶意攻击谩骂
    • 我要吐槽
    确定 取消

    用户登录×

    请输入用户名/手机/邮箱

    请输入密码