uart学习
1.uart介绍:
通用异步收发传输器,是电脑硬件的一部分,它将需要传输的资料在串行通信与并行通信间转换。
异步:就是没有统一的时间线同步节奏。需要靠事先约定一个节奏(波特率)
通俗理解:将电脑内部的并行数据(多个比特同时走)转化为串行数据(一个比特一个比特走),或者反过来进行还原操作。
U = 通用(谁都能用)
A = 异步(靠约定,不靠时钟)
R/T = 收和发(一个负责听,一个负责说)
该总线双向通信,可以实现全双工传输与接收,用于主机与辅助设备通信。
2.通信协议:
是异步串口通信协议的一种,将传输数据一位一位传输。
起始位:先发逻辑"0"信号,表示传输字符的开始。(启动信号)
数据位:采用ASCLL码,低位开始传输。(传输内容)
奇校验位:使包括校验位在内的整个数据帧中二进制 1 的个数为奇数。例如,若数据位中 1 的个数是偶数,校验位就设为 1;若数据位中 1 的个数是奇数,校验位则设为 0。
偶校验位:使包括校验位在内的整个数据帧中二进制 1 的个数为偶数。即若数据位中 1 的个数是奇数,校验位设为 1;若数据位中 1 的个数是偶数,校验位设为 0。
停止位:发"1"高电平,表示传输完毕。停止位越长,容错性越强(适合时钟不同步的设备),但也会让整体速度变慢。(结束信号
空闲位:处于逻辑"1"高电平,表示无数据传输中。
波特率:衡量传输速率的指标,单位 bps,代表一秒传输多少比特。
工作过程:
发数据
空闲状态:线路保持高电平(1),无数据传输。
开始发送:拉低电平(0),持续1位时间T。
发送数据:从低到高依次发送
校验位:奇偶校验,简单检测错误
停止位:拉高电平(1),持续1到2位时间,这帧数据结束
收数据
空闲时监听:线路为高电平,等待信号
检测到起始信号:电平从高变为低时,表示数据来了。
采样:按照16倍指定的波特率的时钟进行采样。(波特率9600bps时,采样时钟为153600HZ)
接收:从低位开始,按序接收8位数据。
检验与结束:检查奇偶校验位是否准确。确认停止位是不是高电平,数据完整。
通知系统:把接收到的数据存入缓存或交给 CPU 处理。
关键设计:16倍采样时钟
每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误码。
3.RS232与RS485
通常所说的uart是一种串行通信协议,规定了数据帧格式,波特率等,而rs232与rs485是两种不同的电气协议。
RS232:点对点,中距离(几十米),采用3~15v电压,抗干扰能力强,适合两个设备间通信,一根线tx发数据,一根线rx收数据,两根线实现全双工。RS232传输速率较低,在异步传输时,波特率为20Kbps.
RS485:远距离(1200米左右),多设备,工业级传输。使用差分信号,通过电压差判断电平高低。两根线实现半双工,同时间只能发或者收,如果再加两根线可以实现全双工通信,支持多设备挂一根总线(32~128个),RS485的数据最高传输速率为10Mbps。
总结:UART 负责“说人话”(数据格式),RS232/RS485 负责“走远路”(物理传输)。
4.流控:
数据在两个串口之间传输 ,可能由于两个计算机处理速度不同,会有数据丢失的现象。而流控可以解决这个问题,当接收端数据接收不过来,会发送“不接收”信号,发送端就停止发送,知道接收到“可以发送”信号再继续。
流控分为硬件流控(RTS/CTS..)与软件流控XON/XOFF。
1.硬件流控:
DTR:数据终端就绪 | 告诉对方,我准备就绪可以传数据了 | (方向:本设备->对端设备,低电平有效) |
DSR:数据装置就绪 | 我知道你准备好了,我回应你我也准备好了 | (方向:对端设备->本设备,低电平有效) |
RTS:请求发送 | 本设备发数据前拉低RTS表示:我想发数据,你听得到吗 | (方向:本设备->对端设备,低电平有效) |
CTS:允许发送 | 对方收到RTS后,自己若准备好接收,拉低CTS表示:可以发,我听得到 | (方向:对端设备->本设备,低电平有效) |
DTR、DSR 是“建立连接的握手”,RTS、CTS 是“发送数据前的确认”,合起来就是一套完整的“礼貌通信协议”。
优点:
不会干扰数据:控制信号走单独的线,和数据完全隔离。
即使传二进制文件、视频、音频,也不会误判。
更可靠,适合高速、工业级通信。
缺点:
需要额外的控制线(至少4根线:TX、RX、RTS、CTS)
接线复杂,成本高,有些简单设备不支持
2.软件流控:
通过数据线本身发送两个特殊字符来控制:
XON:十进制17,表示可以继续发
XOFF:十进制19,表示满了,不要发了
工作过程:
接收方(比如单片机)的缓冲区快满了(比如超过80%)→ 立刻发送一个 XOFF 字符。
发送方收到 XOFF → 立刻停止发送数据。
接收方处理完一部分数据,缓冲区空了(比如低于30%)→ 发送一个 XON 字符。
发送方收到 XON → 立刻恢复发送数据。
优点:
不需要额外的控制线(只用 TX 和 RX 两根线就能搞定)
成本低,接线简单
适合短距离、低速通信(如调试串口、蓝牙模块)
缺点:
如果刚好数据里有个字节是 0x11(XON),接收方就会误以为“可以发了”,导致混乱。
同理,0x13(XOFF)也会被误判为“停止”
项目 | 软件流控(XON/XOFF) | 硬件流控(RTS/CTS) |
控制方式 | 用数据线发特殊字符 | 用独立控制线发信号 |
所需线路 | 只需 TX、RX | 需 TX、RX、RTS、CTS |
是否影响数据 | 可能误判(二进制中出现0x11/0x13) | 完全隔离,无干扰 |
可靠性 | 一般,适合低速 | 高,适合高速/工业 |
成本 | 低 | 稍高 |
常见场景 | 调试串口、蓝牙、简单模块 | 工业设备、调制解调器、高速传输 |
如果传的是文本、命令、日志 → XON/XOFF。
如果是固件、音频、视频、二进制文件 → RTS/CTS硬件流控。
5.Linux Serial介绍
linux系统中,终端是一种字符型设备,具有多种类型,通常使用tty简称各种终端设备,嵌入式普遍采用uart,串行端口,简称端口
常见TTY类型包括串口终端,控制台终端,虚拟终端
串口终端(/dev/ttyS*):
串口终端是是使用计算机串口连接的终端设备,linux将每一个串口视为一个字符设备,对应的设备名称是/dev/ttySAC*
通过串口线连接电脑,用来调试、打印日志、登录系统
控制台终端(/dev/console)
计算机的输出设备被称为控制台终端,printk信息默认输出到这里。/dev/console 是一个虚拟的设备,需要映射到真正的TTY上,
通过内核启动参数“console=ttySCA0”就把console映射到了串口0。就像电视台的“主频道”,所有重要通知都从这里播出去。
虚拟终端(/dev/tty*)
用户登录时,使用的是虚拟终端,tty*被称为虚拟终端,tty0为当前使用的虚拟终端的别名。
就像一台电脑接了多个“用户工作站”,每个人可以独立登录操作。
TTY架构分析
可以将TTY架构分为以下几层:
用户层(读写操作)
↓
TTY核心层(数据处理)<——> 线路规划(line discipline)
↓
TTY驱动层
↓
硬件 ——> UART控制器(RX/TX引脚)
各级的作用
层级 | 作用 | 类比 |
用户空间 | 用 cat /dev/ttySAC0 读写数据 | 顾客寄快递 |
TTY 核心层 | Linux 内核的通用 TTY 管理模块,负责调度 | 快递总公司 |
线路规程 (Line Disc) | 处理特殊字符(如退格、Ctrl+C)、软件流控(XON/XOFF) | 分拣中心(处理包裹标签) |
TTY 驱动层 | 具体的串口驱动(如 UART 驱动),直接操作硬件寄存器 | 快递员(直接送货) |
硬件 | UART 控制器、TX/RX 引脚、电平转换芯片(如 RS232) | 车辆和道路 |
tty设备发送数据流程为:tty核心层拿到用户将要发送给tty设备的数据,tty核心将数据传递给tty线路规划驱动,接着数据被传给tty驱动,tty驱动将数据转换为可以发送给硬件的格式。
而接受数据的流程为:从tty硬件接收到数据向上交给tty驱动,接着进入tty线路规划驱动,然后是tty核心,在这里被用户获取
完整流程:用户程序通过open,read等函数调用核心层,核心层可以通过线路规划与tty驱动进行通信,如果数据不需要处理加工,核心层也可以直接与tty驱动层进行数据传输。tty驱动将数据格式转化为硬件理解的格式,再发送到硬件设备。
在用户程序进行终端设备操作时,要调用核心层操作函数file_operations, 这个结构体里包含了所有操作终端的 “接口函数”(API),是核心层的核心工具。链路层主要是tty_register_driver()函数注册线路规划。终端设备主要实现tty_driver结构体成员的填充,实现成员函数,让tty驱动可以正常运行。
整个流程就像 “用户(程序)→ 中介(核心层)→ 翻译(tty 驱动)→ 硬件”