USART到底在干什么

USART到底在干什么

一、通信五层协议结构

  通信简单说就是把信息按照某种方式从一个地方传送到另一个地方。举个简单的例子,我们不可能一步到位把快递包裹邮寄到目的地,期间需要经过快递驿站,物流中转中心等多个地方,逐级传送才能完成一个包裹的运输。在计算机科学中信息的传递也是类似的,所有的信息不可能直接从一个地方被传送到另一个地方,必然会是一个不断接力传送的过程。一般的我们认为一个完整的通信传输过程要经历五个层级,自顶向下依次为:应用层、运输层、网络层、数据链路层,物理层。

  1. 应用层: 网络模型的最顶层,为用户实际想传输的真实数据。
  2. 运输层: 提供端到端的通信,确保数据可靠地传输,并提供流量控制和差错恢复。
  3. 网络侧: 负责在整个网络中实现端到端的数据传输。它处理数据的路由选择和逻辑寻址,并确保数据通过网络的最佳路径传输。
  4. 数据链路层: 负责在直接相连的两个节点之间提供可靠的数据传输。它划分数据为帧,提供帧同步、流量控制、差错检测和纠正等功能。
  5. 物理层: 关注的是数据在传输介质上的传输,包括电缆、光纤、无线信道等。它定义了传输数据的电气特性、物理连接和传输速率等。

协议(protocol) 定义了在两个或多个通信实体之间交换的报文格式和顺序,以及报文发送和/或接受一条报文或其他事件所采取的动作。报文的含义我可以简单理解为要传输的数据。

  以上是著名的因特网五层协议,这是专门为当今互联网设计的通信协议层次。这样的分层通信协议的概念也可以用来理解其他各种通信协议。

二、什么是usart

  通用同步/异步串行接收/发送器USART(Universal Synchronous/Asynchronous Receiver/Transmitter),是嵌入式设备装置中一种非常常用的通信外设。
通用指的是可以兼容大部分串行通信协议。
同步简单说是指在通信过程中,发送和接收设备需要共用一个时钟线来同步发送和接收的速率。发送设备按照时钟线上的频率发送一个一个的比特(数据),接收设备按照时钟信号的频率对数据进行采样读取。
异步指的是不使用时钟线而提前约定好通信速率完成数据的发送和接收。一般而言发送和接收设备内部有一时钟来设置通信速率(对于stm32这个时钟在usart外设内部,对于51单片机这个时钟是一个独立的时钟外设),发送设备可以在任意时刻开始通信,并按照约定好的通信速率发送数据。而接收设备在接收到数据后,会按照约定好的通信频率对数据进行采样来接收数据。
  在异步通信中,一般的我们用波特率来表示通信速率。所谓波特率及在单位时间内传输二进制的位数。常用的波特率为9600或者115200。

b a u d = n u m t i m e baud = \frac{num}{time} baud=timenum

  • baud-波特率
  • num-一次通信中发送的二进制位数
  • time-一次通信消耗的时间

  对于异步通信来说由于没有统一的时钟线,随着时间的推移,数据发送端的定时器和接收端的定时器很可能出现不同步。导致数据接收出现错误,所以一般异步通信的收发速率不会太高且一次发送的数据量也不会很大。在这里我们约定usart一次发送的数据定义为一帧。

三、异步串行通信(uart)的通信协议的解析

  在串口通信中,一般不涉及复杂的网络结构,往往是简单的设备与设备之间的直接连接,因此,五层协议结构可以简化为三层:及物理层、数据链路层、应用层。

物理层

  关注的是数据在传输介质上的传输,包括电缆、光纤、无线信道等。它定义了传输数据的电气特性、物理连接和传输速率等。在串行通信中常用的物理层协议有以下三种。

  1. RS-232:
    物理层特性: RS-232是一种单端口、点对点的串口通信标准,支持全双工通信。它使用负电平表示逻辑"1",正电平表示逻辑"0"。及逻辑“1”:-3 ~ -15V ; 逻辑为“0”:+3 ~ +15V。
    电气特性: RS-232通常使用较高的电压级别(通常为±12V),适用于相对短距离通信,如计算机与串口设备之间的连接。
    适用场景: 适用于点对点连接,距离相对较短,不适合工业环境中的长距离传输或在电气噪声较大的环境中使用。
  2. RS-485:
    物理层特性: RS-485是一种多端口、多点的串口通信标准,支持半双工或通信。它使用差分信号传输,即正负两个线,可以抵抗电气噪声。
    电气特性: RS-485使用较低的电压级别(通常为±5V或±3.3V),支持长距离传输,可达数千米。
    适用场景: 适用于工业环境中的长距离通信,如工厂自动化、建筑物自动控制系统等。
  3. TTL:
    物理层特性: TTL(Transistor-Transistor Logic)是一种数字电平的逻辑家族。TTL信号中,高电平表示逻辑"1",低电平表示逻辑"0"。一般的,高电平为大于2.4V,低电平为小于0.4V。
    电气特性: TTL通常使用低电压级别(通常为0V到5V之间)。
    适用场景: 适用于短距离通信,如微控制器与传感器之间的连接。

  总的来说,RS-232适用于点对点、相对短距离通信,RS-485适用于多点、长距离通信,而TTL通常用于微控制器等低功耗设备的短距离通信。具体选择其中哪一种标准通常取决于具体的应用场景和通信要求。

数据链路层

  负责在直接相连的两个节点之间提供可靠的数据传输。它划分数据为帧,提供帧同步、流量控制、差错检测和纠正等功能。
  在一般嵌入式通信中我们使用的都是异步串行通信协议(以下简称串口协议),很少会使用带有时钟线的同步串行通信协议。从起始位开始到停止位结束之间的所有数据我们称为uart的一帧数据,一个标准的串口通信协议如下图所示:

  • 空闲位 电平状态为高电平 表示没有数据传输 长度不定
  • 起始位 电平状态为低电平 表示开始发送数据 长度为个一位 (baud的倒数为一位的长度)
  • 数据位 高电平表示二进制1 低电平表示二进制0 协议允许长度为5-8位 可根据情况自行设置
  • 校验位 高电平表示二进制1 低电平表示二进制0 用于对数据位的数据进行校验 采用何种校验方式以及是否校验可以自行设置 长度为1位
  • 停止位 电平状态为高电平 表示一帧数据发送结束 协议允许长度为1-2个位 可根据情况自行设置

1位为一个二进制数 表示为 1 b i t 1bit 1bit 长度(持续时间)为波特率的倒数
8 b i t = 1 b y t e 8bit=1byte 8bit=1byte

  起始位和终止位划分数据为帧,起始位和波特率提供帧同步,校验位提供差错检测功能。

应用层

  应用层在uart通信中一般为用户希望发送的数据,可以自定义也可以使用已有的通信协议,一般来说都需要定义数据传输遵循的编码标准,应用层的帧头帧尾,校验码等。

四、串口通信的过程

数据接收

在通信过程中,我们规定串口通信的数据位为8位。

  1个字节的数据接收过程如下图所示:

  10个字节的数据接收过程如下图所示:

  对于异步串行通信来说,通信的发生是一个随机事件。如果让CPU主动等待通信的开始,将浪费宝贵的资源。因此一般来说,在串口通信中,我们常用中断来完成数据的接收。

  中断 是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
  简单说就是打断CUP当前执行的任务转而执行其他的突发任务。

  当通信开始时,系统会通过预先设定好的某种机制,打断CPU当前正在执行的指令,转而运行提前设定好的接收数据的指令。在STM32中,这个提前设定好的指令被称为中断服务函数。当然,在中断服务函数中,我们也可以加入一些对数据解析等其他指令。当提前设定好的接收指令运行结束后,CPU回到中断发生前的状态,继续执行原先未能执行完的指令。
  在实际的串口通信中,单次只发送一个字节的通信,是极少数情况。绝大多数情况下,串口一次传输的数据是包含多个字节的,甚至是不定长的。需要特别注意的是,串口每接收一个字节的数据,就会产生一次中断。如果站在应用层的角度,发送的一帧数据为10个字节,那么站在物理层层的角度来看,将会产生10次中断,来完成一帧应用层数据的接收。

数据发送

  数据相对数据接收要简单很多,及向指定寄存器存入要发送的数据即可开始发送。但要注意的是,对于多字节数据的发送,每传入一字节数据,需要等这个字节数据彻底发送完成以后再向寄存器写入下一字节的数据。如若不如,数据发送将出现错误。

  • 18
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值