我打赌!你还不会UART
前面的话
自从国庆长假被密密麻麻的红色炸弹击中之后,酒也没少喝,最终喝到断片进了医院,身体恢复后终于更新了一篇基础的UART,献给刚好需要的您;
目录
1 UART发展历史
1.1 早期的串行通讯设备
1.2 早期的芯片级UART
1.3 现代UART的发展
2 预备知识
3 协议层
起始位
数据
校验位
停止位
波特率
4 传输过程
5 物理层
6 优缺点
1 UART发展历史
1.1 早期的串行通讯设备
早期的电报机器使用长度可变的脉冲信号进行数据传输,比如摩斯电码;
后来电传打印机(teleprinters
)普遍使用5、6、7或8个数据位来表示各种字符编码,最终成为计算机外围设备。电传打字机( teletypewriter
简称 tty
)成为小型计算机十分出色的通用I/O
设备。
由于历史的发展原因,早期在Unix终端是一个名字为ASR33的电传打字机,而电传打字机的英文单词为
Teletype
(或Teletypewritter
),缩写为tty
。因此,终端设备也被称为tty
设备。这就是TTY这个名称的来源。
1.2 早期的芯片级UART
DEC(Digital Equipment Corporation
)公司的Gordon Bell 为该公司的PDP系列计算机设计了第一个UART,不过体积庞大,UART的线路占据了整个电路板;
后来DEC将串行线路单元的设计浓缩为早期的UART单芯片,以方便自己使用。
DEC是美国一家计算机公司;
西部数据(Western Digital
)公司在1971年左右将其开发为第一个广泛可用的UART
单芯片 WD1402A
。这是中型集成电路的早期产品。
Western Digital
是美国计算机硬盘驱动器制造商和数据存储公司。
1.3 现代UART的发展
2000年代开始,大多数IBM或者相关的计算机都删除了其外部RS232的COM端口,将其替换为带宽性能更加出色的USB端口;
对于仍然需要RS-232串行COM端口的用户,现在通常使用外部USB转UART转换器,常见的有CH340,Silicon Labs 210x的驱动程序,现在很多处理器和芯片都内置了UART。
2 预备知识
通用异步收发传输器(Universal Asynchronous Receiver/Transmitter
,通常称为UART),在UART通信中,两个UART直接通信。
发送端的UART
将来自控制设备(如CPU)的并行数据转换为串行数据,以串行方式将其发送到接收端的UART
,然后由接收端的UART将串行数据转换为并行数据以用于接收设备的正常处理。
这里只需要两条线RX/TX即可在两个UART之间传输数据。具体如下图所示;
3 协议层
UART传输的数据被封装成数据包。每个数据包包含1个起始位,5~9个数据位(取决于UART的具体设置),一个可选的奇偶校验位以及1个或2个停止位,具体如下图所示;
起始位
UART数据传输线通常在不传输数据时保持在高电平。
为了开始数据传输,发送端UART在一个时钟周期内将传输线从高电平拉低到低电平。
当接收端UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据位中的每一位数据。
数据
数据位包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。
在大多数情况下,数据首先以低有效位发送。
校验位
在串口通信中一种简单的检错方式。
有四种检错方式:偶校验、奇校验、高校验和低校验。当然没有校验位也是可以的。
对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
举个例子,如果数据是011
,则满足;
偶校验,校验位为0,保证逻辑高的位数是偶数个。
奇校验,校验位为1,这样就有3个逻辑高位。
具体如下图所示;
高位和低位不是真正的检查数据,而是强行将校验位设置为逻辑高或者逻辑低。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
停止位
发送端UART将数据传输线从低电压驱动到高电压至少持续两位数据的时间宽度来表示整个数据包的传输已经结束。
由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容错性越好,但是数据传输率同时也越慢。
波特率
波特率是串口数据的传输速度,即Bit/s
,常见的波特率有:9600,19200,38400,57600,115200,当然还有很多波特率,不再一一给出;
假设目前UART的配置为,1个起始位,8个数据位,0个校验位,1个停止位,那么9600的波特率,可以计算出每一位数据的时间宽度为:
那么传输一个字节(也就是10 bit 数据)需要的时间为 1.04 毫秒。
下面用串口抓取了UART的TX上的信号,其中一位数据的时间宽度为26微秒,具体如下图所示;
则可以简单计算得到;
因此波特率大概为 38400;
下表是各个波特率下数据位时间宽度;
Time | Baud Rate |
---|---|
3333µs (3.3ms) | 300 |
833µs | 1200 |
416µs | 2400 |
208µs | 4800 |
104µs | 9600 |
69µs | 14400 |
52µs | 19200 |
34µs | 28800 |
26µs | 38400 |
17.3µs | 57600 |
8µs | 115200 |
4.34µs | 230400 |
4 传输过程
发送端UART从数据总线转换并行数据:
发送端UART将起始位,奇偶校验位和停止位添加到数据包中:
整个数据包从发送端UART串行发送到接收端UART;接收端UART按照预先配置好的波特率对数据线进行采样:
接收端UART解析接收的数据,丢弃数据包中的起始位,奇偶校验位和停止位:
接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:
5 物理层
UART、RS232、RS485在串口通信中,主要区别是电平的不同,其中UART通常使用TTL电平,下面介绍这几个存在的差异;
TTL
TTL全名是晶体管-晶体管逻辑集成电路(Transistor-Transistor Logic
)
输入高电平最小2V,输出高电平最小2.4V,典型值3.4V;
输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
RS232
RS232 逻辑1电平(MARK)=-3V~-15V,逻辑0电平(SPACE)=+3~+15V;
同样的,对于传输数据0x55
,即二进制的01010101
,RS232和TTL的区别如下;
RS485
RS485是差分信号进行串行传输;
逻辑1以两线间的电压差为
+(2~6)V
表示;逻辑"0"以两线间的电压差为
-(2~6)V
表示;
在工业通信中,使用RS485比较多,因为RS485是差分信号,可以抑制共模干扰,因此在恶劣的环境中拥有很好的抗干扰性,比较稳定;
6 优缺点
没有任何通信协议是完美的,以下是UART的一些利弊,可帮助您确定它们是否适合您的项目需求:
优点
通信只需要两条数据线;
无需时钟信号;
有奇偶校验位,方便通信的差错检查;
只需要接收端和发送端设置好数据包结构,即可稳定通信;
缺点
数据帧最大支持9位数据;
不支持多主机或多从机的主从系统;
简易PID算法的快速扫盲
一文教你搞懂C语言的Q格式
现成轮子OSAL操作系统抽象层的移植
一招教你单片机固件快速瘦身
基础知识 | hex文件格式详解
—— The End ——
长按识别二维码关注获取更多内容
我打赌!你还不会UART相关推荐
- Linux UART驱动分析及测试
1.Linux TTY驱动程序框架 Linux TTY驱动程序代码位于/drivers/tty下面.TTY的层次接口包括TTY应用层.TTY文件层.TTY线路规程层.TTY驱动层.TTY设备驱动层.T ...
- RT-Thread记录(十二、I/O 设备模型之UART设备 — 使用测试)
从 UART 设备开始学会使用 RT-Thread I/O 设备模型 . 目录 前言 一.UART 设备操作 1.1 UART 设备控制块 1.2 UART 操作函数 1.2.1 查找 UART 设备 ...
- i2cdetect检测不到i2c设备_I2C基础知识入门
废话 I2C其实肝的我挺难受的,通讯协议这种规范往往可以抠出很多的细节,看了波叔的文章<万变不离其宗之I2C总线要点总结>,很详细.我打赌我还不会I2C,因为涉及到很多技术细节,在实际项目 ...
- at指令 fpga_FPGA毕设系列 | 无线通信
在上一篇文章中,我们介绍了通过Uart实现数据的收发,在此基础上,我们进一步为小伙伴们分享如何在FPGA中通过UART配置ESP8266无线模块,最终实现无线通信系统的设计. 一.设计任务 通过手机或 ...
- STM32F103_USART_GPIO配置及相应的IO口设置
STM32 系列单片机 GPIO 资料收集及总结 一.GPIO 配置 (1)GPIO_Mode_AIN 模拟输入 (2)GPIO_Mode_IN_FLOATING 浮空输入 (3)GPIO_Mode_ ...
- 国内MCU厂商也开始卷了
最近我大学老师准备做一个项目,需要用到STM32的芯片,然后我就帮忙着一起找,不找不知道,找了才知道这个东西真的是贵. 然后我就看了GD32,不了解不知道,这个东西也是真的贵.然后我又去看的MM32, ...
- jtag引脚定义_从逆向分析的角度学习硬件调试技巧JTAG,SSD和固件提取
我想从逆向的角度做了深入了解JTAG,JTAG是许多嵌入式CPU使用的硬件级别调试机制,我希望通过这篇文章从逆向工程师的角度解释如何使用JTAG,并在此过程中提供一些实际示例. 0x01 研究目标 通 ...
- c语言复制粘贴快捷键_C++小知识:复制粘贴代码千万要小心
错误代码: sampleCount VoiceKey::OnBackward (....) { ... int atrend = sgn(buffer[samplesleft - 2]- buffer ...
- E280-2G4T12S(SX1280)_STM21F1X驱动分享
根据需求,我们需要实现的功能有:1.工作模式的切换, 2. 接收数据的存储处理, 3.发射数据的准备, 4.通信逻辑的设计,SX1280驱动开发的主要步骤如下: 初始化 工作模式的切换 测试结果 1. ...
最新文章
- OpenAI推出数学推理证明模型,推理结果首次被数学家接受
- 在长沙怎么挑选装饰公司
- More Effective C# Item3 : 运行时检查泛型参数的类型并提供特定的算法
- 本文以H264视频流为例,讲解解码流数据的步骤。
- CF1039E-Summer Oenothera Exhibition【LCT,根号分治】
- c程序设计语言 练习1-6,C程序设计语言:第一章练习
- 【转】最为详尽的WPF类继承关系*!
- f分布表完整图a=0.05_2019年05月16日,沪深A股股票分析
- log4net根据日志类型写入到不同的文件中
- INTELIED,PCIIEDX, ATAPI,Disk.sys的关系
- Word模板导出更新目录
- 腾达和小云无线路由中继(WISP)解决
- 2023最新自助下单彩虹云商城系统源码+免授权无后
- 邻接矩阵的存储方式实现图的广度和深度优先遍历
- 英语语言学论文选题 计算机,88个英语语言学、语言论文题目选题参考
- Java实现 LeetCode 54 螺旋矩阵
- 一文读懂大唐杯所有名词解释
- 阿里天池比赛多次拿前3,如何做到?
- Matplotlib折线图线型设置
- 创建并运行 EMR on EKS 集群
热门文章
- destoon数据库表解释说明
- 注册 Apple Developer Program
- Flume跨服务器监控日志数据
- 计算机及应用自考考研学校,【王道论坛统计】2010 34所自主划线院校计算机复试线及相关详细报考信息(感谢gumuguo)...
- ROS利用Python脚本实现多点自主导航
- unity2D-笔记 玩家跳跃时,游戏场景消失
- 【XSS漏洞-01】XSS漏洞简介、危害与分类及验证
- c#导出Excel NPOI方式
- V20变频器MODBUS-RTU通信和内置PID应用
- 多多自走棋改动_多多自走棋:重大更新,一直被玩家念叨的两个地方终于改了...