当前位置: 首页 > news >正文

一文搞懂UART通信协议

目录

1、UART简介

2、UART特性

3、UART协议帧

3.1、起始位

3.2、数据位

3.3、奇偶校验位

3.4、停止位

4、UART通信步骤


1、UART简介

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就能实现全双工通信。典型的串口通信使用3根线完成,分别是:发送线(TX)、接收线(RX)和地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信,如下图所示:

2、UART特性

UART 接口不使用时钟信号来同步发送器和接收器设备,而是以异步方式传输数据。发送器根据其时钟信号生成的位流取代了时钟信号,接收器使用其内部时钟信号对输入数据进行采样。
同步点是通过两个设备的相同波特率(UART和大多数串行通信一样,发送和接收设备需要将波特率(波特率是指信息传输到信道的速率)设置为相同的值。对于串行端口,设定的波特率将用作每秒传输的最大位数)来管理的。
如果波特率不同,发送和接收数据的时序可能会受影响,导致数据处理过程出现不一致。允许的波特率差异最大值为10%,超过此值,位的时序就会脱节。

总结了关于UART必须了解的几点:

导线数量3根(TX、RX和GND)
速度1200、2400、4800、9600、19200、38400、57600、115200等
传输方式全双工异步
最大主机数量1
最大从机数量1

3、UART协议帧

UART中,传输模式为数据包形式。数据包由起始位、数据帧、奇偶校验位和停止位组成。

3.1、起始位

当不传输数据时, UART 数据传输线通常保持高电压电平。若要开始数据传输,发送UART 会将传输线从高电平拉到低电平并保持1 个时钟周期。
当接收 UART 检测到高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。

3.2、数据位

数据帧包含所传输的实际数据。如果使用奇偶校验位,数据帧长度可以是5 位到 8 位。如果不使用奇偶校验位,数据帧长度可以是9 位。
在大多数情况下,数据以最低有效位优先方式发送。

3.3、奇偶校验位

奇偶性描述数字是偶数还是奇数。通过奇偶校验位,接收 UART判断传输期间是否有数据发生改变。电磁辐射、不一致的波特率或长距离数据传输都可能改变数据位。
校验位可以配置成 1 位偶校验或 1 位奇校验或无校验位。
接收UART 读取数据帧后,将统计数值为 1 的位,检查总数是偶数还是奇数。如果奇偶校验位为0 (偶数奇偶校验),则数据帧中的1或逻辑高位总计应为偶数。如果奇偶校验位为 1 (奇数奇偶校验),则数据帧中的1 或逻辑高位总计应为奇数。
当奇偶校验位与数据匹配时,UART 认为传输未出错。但是,如果奇偶校验位为0 ,而总和为奇数,或者奇偶校验位为 1 ,而总和为偶数,则UART 认为数据帧中的位已改变。

3.4、停止位

为了表示数据包结束,发送 UART 将数据传输线从低电压驱动到高电压并保持1 2 位时间。

4、UART通信步骤

第1步:数据从数据总线到发送器。

第2步:发送 UART 将起始位、奇偶校验位和停止位添加到数据帧。

第3步:从起始位到结束位,整个数据包以串行方式从发送器送至接收
接收 UART 以预配置的波特率对数据线进行采样。

第4步:接收 丢弃数据帧中的起始位、奇偶校验位和停止位。

第5步:接收 将串行数据转换回并行数据,并将其传输到接收端的数据总线。


拓展学习:

1、一文搞懂SPI通信协议

2、一文搞懂I2C总线通信

3、 一文看懂Modbus协议

4、 一文搞懂PID控制算法 

5、一文搞懂TCP的三次握手和四次挥手 

6、一文搞懂图像二值化算法 

7、 一文搞懂步进电机特性、原理及驱动器设计 

8、 一文搞懂三级管和场效应管驱动电路设计及使用 

9、ADI期刊-UART:了解通用异步接收器-发送器的硬件通信协议 

相关文章:

  • 小程序day02
  • LeetCode----52. N 皇后 II
  • 音视频rtsp rtmp gb28181在浏览器上的按需拉流
  • iOS NSKeyedUnarchiver归档和读取
  • ruoyi系统改造
  • 遥遥领先,免费开源的django4-vue3前后端分离项目
  • FreeSWITCH mrcp-v2小记
  • Java生成微信小程序二维码,5种实现方式,一个比一个简单
  • Spring Boot实践 --windows环境下 K8s 部署 Docker
  • k8s系列文章一:安装指南
  • 家用洗地机什么牌子最好?家用洗地机排行榜
  • 【Linux进程】环境变量
  • YOLOv7优化策略:IOU系列篇 | 引入MPDIoU,WIoU,SIoU,EIoU,α-IoU等创新
  • java数据机构.冒泡排序,选择排序 插入排序 递归算法,递归求阶乘,快速排序
  • 小程序使用echarts(超详细教程)
  • 收藏网友的 源程序下载网
  • [iOS]Core Data浅析一 -- 启用Core Data
  • echarts的各种常用效果展示
  • gf框架之分页模块(五) - 自定义分页
  • IOS评论框不贴底(ios12新bug)
  • Js基础——数据类型之Null和Undefined
  • js正则,这点儿就够用了
  • JS字符串转数字方法总结
  • php中curl和soap方式请求服务超时问题
  • React16时代,该用什么姿势写 React ?
  • Spark学习笔记之相关记录
  • Tornado学习笔记(1)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Yeoman_Bower_Grunt
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 服务器从安装到部署全过程(二)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 前端代码风格自动化系列(二)之Commitlint
  • 使用SAX解析XML
  • 小程序开发之路(一)
  • 白色的风信子
  • postgresql行列转换函数
  • UI设计初学者应该如何入门?
  • 移动端高清、多屏适配方案
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (学习日记)2024.04.10:UCOSIII第三十八节:事件实验
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Core 成都线下面基会拉开序幕
  • .net mvc部分视图
  • .NET 解决重复提交问题
  • .sdf和.msp文件读取
  • .考试倒计时43天!来提分啦!
  • :=
  • @Controller和@RestController的区别?
  • @EnableConfigurationProperties注解使用