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

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 驱动)→ 硬件”

http://www.dtcms.com/a/358748.html

相关文章:

  • Jdk动态代理 Cglib动态代理
  • MYSQL表结构优化场景
  • 解构机器学习:如何从零开始设计一个学习系统?
  • folium地图不显示加载不出来空白问题解决
  • SAP PP模块的MPS
  • 福彩双色球第2025100期篮球号码分析
  • git在push和clone等操作时显示‘: Invalid argument
  • 优选算法:二分查找
  • #5:Nginx核心使用技术
  • Java 学习笔记(基础篇12)
  • 小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏
  • 计算机视觉与深度学习 | 基于深度学习的图像特征提取与匹配算法综述及MATLAB实现
  • 互联网大厂大模型应用开发岗位面试:技术点详解与业务场景演练
  • nacos3端口漂移问题
  • shell编程-核心变量知识
  • LeetCode - 234. 回文链表
  • 2025年高性能计算年会
  • Golang 面试题「高级」
  • 零碳智慧园区双碳方案
  • 代理IP网站哪家好?全球优质IP代理服务商有什么推荐?
  • 【Linux】网络安全管理:Netfilter、nftables 与 Firewalld | Redhat
  • Linux查看Java进程PID、端口号和内存占用脚本
  • 2023年山东省信息学小学组(CSP-X)第一轮题解
  • 【嵌入式原理系列-第六篇】从Flash到RAM:MCU ld脚本全解析
  • SUMO 与 孪易 IOC 协同:开启交通数字孪生新纪元
  • 哪些人需要考道路运输安全员证?政策要求与适用范围
  • 计算机网络面试集合
  • 通过jar -jar启动jar包的yml配置logback 指定log目录
  • 2025-08-18面试题关于公司
  • 【计算机视觉】Pixel逐像素分类Mask掩码分类理解摘要