!文章内容如有错误或排版问题,请提交反馈,非常感谢!
UART 是什么?
UART 是 通用异步收发器 的缩写。它是一种硬件设备(通常是一个微控制器内的集成电路模块)或基于软件的逻辑,用于实现异步串行通信。
- 通用: 意味着它不是专为某种特定类型的设备设计,而是适用于多种设备和应用场景。
- 异步: 数据传输不需要额外的时钟信号线来同步发送方和接收方。发送方和接收方各自依赖本地时钟,并通过协议本身(起始位和停止位)来确定数据的开始和结束。这是它与 SPI、I²C 等同步串行协议的关键区别。
- 收发器: 意味着 UART 既能发送数据(作为发送器),也能接收数据(作为接收器)。
核心特性
- 串行通信: 数据位是一个接一个地、按顺序在单条数据线上传输(发送和接收各有独立的线)。这与并行通信相对(多个数据位同时传输)。
- 异步: 如前所述,不需要共享的时钟信号。双方事先约定好传输速率(波特率)。
- 全双工: 独立的发送线 (TX) 和接收线 (RX) 允许数据在同一时间双向传输。
- 点对点: 标准的 UART 通信发生在两个设备之间(一个主对另一个主)。要连接多个设备,通常需要额外的硬件(如多路复用器)或软件协议。
- 简单: 硬件实现和软件协议都相对简单,成本低。
UART 如何工作?
数据帧
UART 通信围绕“数据帧”的结构进行。一个完整的数据帧传输包括以下部分:
- 空闲状态: 在数据发送之前,传输线(TX/RX)通常处于高电平状态(逻辑“1”,通常对应于 RS-232 标准中的负电压,或者 TTL 电平中的 VCC)。
- 起始位: 发送方通过在 TX 线上产生一个低电平(逻辑“0”)来表示传输的开始。这个持续 1 个位时间(由波特率决定)的低电平信号通知接收方:“数据马上来了!”。
- 关键作用:提供同步点,允许接收方根据这个下降沿来校准其内部时钟,为后续位的采样做准备。
- 数据位: 起始位之后,紧接着传输有效数据。通常是 5、6、7 或 8 位(最常用的是 8 位)。数据位按顺序(LSB 最低位先行或 MSB 最高位先行,常见的是 LSB first)传输。
- 数据位代表实际要传送的信息(一个字符、一个字节)。
- 校验位(可选): 数据位之后,可以传输一个校验位,用于简单的错误检测。
- 类型:
- 无校验: 不传输校验位。
- 奇校验: 保证整个帧(数据位 + 校验位)中“1”的数量为奇数。
- 偶校验: 保证整个帧(数据位 + 校验位)中“1”的数量为偶数。
- 作用:接收方计算收到的数据位中“1”的个数,并与校验位比较。如果奇偶性不符,则说明传输过程中可能发生了单个位的错误。它只能检测单比特错误,不能纠正,也不能检测双比特错误。
- 类型:
- 停止位: 表示一个数据帧的结束。停止位是高电平(逻辑“1”),持续时间可以是 1 位、5 位或 2 位时间(常用的是 1 位)。
- 作用:为接收方提供缓冲时间来处理接收到的字节。同时,一个完整的高电平到下一个起始位的低电平跳变确保了帧与帧之间有清晰的界限。
通信过程
- 初始化:通信双方必须严格约定好以下参数:
- 波特率:数据传输的速率(位每秒,bps)。常见值有 9600, 19200, 38400, 57600, 115200 等。双方的波特率必须完全一致! 速度不匹配会导致数据解读错误(乱码)。
- 数据位长度:(通常是 8 位)。
- 校验位类型:(无、奇、偶)。
- 停止位数量:(通常是 1 位)。
- 硬件流控:是否启用 RTS/CTS(Request To Send / Clear To Send)控制信号来控制数据流,防止接收方缓冲区溢出。(可选)
- 发送:
- 发送端 UART 将并行数据(来自微控制器或其它源)转换为串行格式。
- 它生成起始位(低)。
- 按照设定依次串行输出数据位 (LSB/MSB first)。
- 计算并输出校验位(如果启用)。
- 输出停止位(高)。
- 然后返回空闲状态或开始传输下一帧。
- 接收:
- 接收端 UART 持续监控其 RX 线。
- 当检测到 RX 线从高(空闲)跳变到低(起始位开始)时,将其作为同步信号。
- 在接下来的每个位时间的中心点(通常是采样时间为1个位时间的16倍,在第8、9、10次采样时取多数)采样 RX 线的电平。
- 采样到数据位、校验位(如果有)。
- 在停止位期间检测是否为高电平(确保帧完整)。
- 检查奇偶性(如果启用)。
- 将串行数据组装回并行数据,并提供给微控制器或其它设备。
- 如果奇偶校验错误或未检测到有效的停止位,则通常会设置错误标志。
初始化参数约定
UART通信双方参数的严格约定是通过硬件设计、软件配置与工业标准规范三重机制实现的,以下是具体实现方式:
参数约定的核心维度
双方必须完全一致的参数:
- 波特率(Baud Rate)
- 数据位长度(Data Bits,5/6/7/8 bit)
- 停止位数量(Stop Bits,1/1.5/2 bit)
- 校验位类型(Parity,None/Odd/Even/Mark/Space)
- 硬件流控使能(RTS/CTS)
注:物理层电平(TTL/RS-232/RS-485)也需匹配,但属于电气层而非协议层约定。
实现参数约定的技术手段
1) 硬件设计固化(不可修改)
- 场景:固定功能的工业设备(如传感器、PLC模块)
- 实现方式:
- 波特率生成电路使用晶体振荡器+固定分频系数(如16MHz晶振 → 分频值138 → 115200 bps)
- 参数焊死在PCB上(如MAX3232芯片硬接线为8N1模式)
- 典型案例:
- 温湿度传感器输出:固定9600-8-N-1
- MODBUS RTU仪表:固定19200-8-E-1
2) 软件初始化配置(可编程设置)
嵌入式代码示例(STM32 HAL库):
UART_HandleTypeDef huart; huart.Instance = USART1; huart.Init.BaudRate = 115200; // 波特率 huart.Init.WordLength = UART_WORDLENGTH_8B; // 8位数据 huart.Init.StopBits = UART_STOPBITS_1; // 1位停止位 huart.Init.Parity = UART_PARITY_NONE; // 无校验 huart.Init.HwFlowCtl = UART_HWCONTROL_RTS_CTS; // 硬件流控 HAL_UART_Init(&huart);
PC端代码示例(Python PySerial):
import serial ser = serial.Serial( port = 'COM3', baudrate = 115200, # 波特率必须匹配 bytesize = serial.EIGHTBITS, # 数据位 parity = serial.PARITY_NONE, # 校验位 stopbits = serial.STOPBITS_ONE # 停止位 )
3) 自动协商协议(高级方案)
- 原理:先以默认低波特率(如1200 bps)建立连接 → 交换配置报文 → 切换到目标参数
- 实现步骤:
- 设备上电后以 1200-8-N-1 发送握手字0xAA
- 主机收到后回复目标参数(如”BAUD=115200,DATA=8,PARITY=N”)
- 双方同时切换到新参数通信
- 行业应用:
- 蓝牙模块(BLE UART服务)
- 智能电表DL/T645协议
4) 用户界面配置(人工介入)
- 设备提供拨码开关/DIP开关:(拨码开关设置波特率:ON=1, OFF=0 → 二进制编码对应波特率表)
- 通过AT指令动态修改(常见于4G模块):
AT+UART=115200,8,1,0,0 // 设置115200-8-N-1无流控
参数偏差的容错机制
即使约定一致,时钟误差仍可能导致采样错误:
误差源 | 容错技术 |
晶体频率偏差(±50ppm) | 接收端使用16倍过采样(在数据位中心采样) |
瞬时干扰 | 硬件流控(RTS/CTS)暂停数据传输 |
长距离信号衰减(RS-485) | 降低波特率(≤115200 bps) + 终端电阻 |
采样原理:
- 检测起始位下降沿后,在第7、8、9个时钟周期采样
- 取3次采样值的多数结果(如2高1低判为高电平)
物理电平 TTL UART vs RS-232 vs RS-485
以下是 TTL UART、RS-232 和 RS-485 三种串行通信标准的详细对比。它们本质上是 不同层级的技术:
- UART (Universal Asynchronous Receiver/Transmitter):
- 协议层:定义异步串行通信的 数据帧格式(起始位、数据位、校验位、停止位)、时序控制逻辑(基于波特率)和 基本错误检测(奇偶校验)。
- 物理层 (原始/裸 UART, 通常称为 TTL UART):指定了逻辑电平(0V = 逻辑0, 3.3V/5V = 逻辑1)和基本的点对点连接方式(TX, RX, GND)。
- RS-232 (Recommended Standard 232) 和 RS-485 (Recommended Standard 485):
- 物理层标准:它们在 UART 协议之上,定义了更健壮的 电气特性(电压范围、驱动能力)、连接器类型(如 DB9)、信号定义(包括控制信号)、线缆要求 和 通信距离。
- 目标:解决 TTL UART 在 通信距离、抗干扰能力(EMI)和连接拓扑 上的局限性。
核心对比表
特性 | TTL UART | RS-232 | RS-485 |
本质 | 通信协议 + 基本电平 (物理层) | 物理层接口标准 | 物理层接口标准 |
逻辑 ‘0’ | 0V (接近 GND) | +3V 至 +15V (在接收端被解释为 ‘0’) | +1.5V 至 +6V (B线电压 高于 A线时) |
逻辑 ‘1’ | 3.3V 或 5V (Vcc) | -3V 至 -15V (在接收端被解释为 ‘1’) | +1.5V 至 +6V (A线电压 高于 B线时) |
信号类型 | 单端 (Unbalanced) | 单端 (Unbalanced) | 差分 (Balanced) |
通信距离 | 短 (1-2米), 易受干扰 | 中等 (约 15米 @ 20kbps) | 长 (可达 1200米 @ 100kbps) |
最大速率 | 较高 (受限于MCU/线长, 可达 Mbps) | 较低 (受限于电容/距离, 通常 < 200kbps) | 高 (可达 10Mbps+, 但速率升高距离缩短) |
抗干扰性 | 非常差 | 较差 | 极好 (共模噪声抑制) |
拓扑结构 | 点对点 (Peer-to-Peer) | 点对点 (Peer-to-Peer) | 多点 (Multi-drop / Bus) |
最大收发器数 | 2 (1 Tx + 1 Rx) | 2 (1 DTE + 1 DCE, 复杂定义) | 多达 32/128/256单元 (驱动器+接收器) |
传输模式 | 全双工 (Full-Duplex) | 全双工 (Full-Duplex) | 半双工 (Half-Duplex) 或 全双工 |
线路要求 | TX, RX, GND (3线) | 最少 TX, RX, GND (3线), 常需更多控制线 | 最少 2 线 (A/B + GND) 用于半双工 |
连接器 | 无标准 (常为引脚、排针) | DB9, DB25 (标准连接器) | 无强制标准 (常为端子台、RJ45、DB9) |
驱动能力 | 弱 (~mA级) | 中等 | 强 (> ±1.5V 差分驱动, 高阻抗接收) |
接地要求 | 共地 (必须) | 常需共地 (但地环路易引入噪声) | 可支持隔离 (无需共地) |
主要应用场景 | 板内/板间, MCU↔传感器/模块, 调试 | PC串口,老式Modem/鼠标,短距工业设备 | 工业自动化总线 (Modbus RTU, Profibus), 楼宇控制, 远距/噪声环境 |
电平转换芯片 | — | MAX232, SP3232, CH340 | MAX485, SP3485, SN65HVDxx |
关键差异详解
- 逻辑电平与信号类型:
- TTL UART: 使用单端信号 (0V=0, Vcc=1),电平范围小,极易受电源波动、地偏移和外部电磁干扰(EMI)影响。
- RS-232: 也使用单端信号,但采用更高的正负电压范围 (-15V 至+15V)。较大的电压摆幅使其比 TTL 更抗干扰且可驱动稍长线缆,但仍有距离和速度限制。它的 逻辑1(空闲) 是负电压 是其显著特点。
- RS-485: 采用差分信号传输,数据在两根线 (A 和B) 上的 电压差 表示逻辑状态 (V_A – V_B > +阈值 = 1; V_A – V_B < -阈值 = 0)。差分信号对共模噪声(同时作用于A线和B线的噪声)有天然抑制能力,大幅提高抗干扰性和允许更远的传输距离。
- 通信距离与抗干扰性:
- TTL UART: 距离极短(通常小于2米),电平易被干扰淹没,仅适用于安静、近距离的电路板内/板间通信。
- RS-232: 标准定义的理论极限约为15米(在较低波特率下),实际受线缆质量、环境噪声影响较大。距离增加或速度提高时误码率显著上升。
- RS-485: 长距离通信之王。标准定义可达1200米(在100kbps速率下)。通过使用优质双绞线、适当的终端电阻、较低的波特率(牺牲速度换距离),甚至可达到数公里。其差分架构提供卓越的共模噪声抑制能力,非常适合工厂等电气噪声环境。
- 拓扑结构(设备连接方式):
- TTL UART / RS-232: 严格 点对点。一个发送器 (TX) 只能连接一个接收器 (RX) 。不支持在一个通道上连接多个设备(除非通过硬件/软件多路复用)。
- RS-485: 原生支持 多点/总线拓扑。所有设备的A 线和 B 线分别并行连接到同一对总线上(需正确使用端接电阻)。同一时刻只允许一个设备作为发送器(驱动总线),其他设备处于接收状态。这使得构建由数十个甚至数百个节点组成的网络成为可能(如 Modbus RTU 网络)。
- 传输方向(全双工 vs 半双工):
- TTL UART / RS-232: 通常使用独立线对(TX-RX 和 RX-TX)实现 全双工,即同时发送和接收。
- RS-485:
- 半双工 (最常见): 仅使用一对线(A和B)。同一时间只能发送 或 接收,由收发器芯片的RE(接收使能) 和 DE(发送使能) 信号控制方向切换。
- 全双工: 需要使用 两对 差分线(即4根线:A1/B1 用于发送,A2/B2 用于接收)。这相当于同时运行两个独立的半双工RS-485通道。全双工需要更多线缆且应用相对较少。
- 实际应用注意事项:
- 电平转换绝对必需:
- 切勿将 TTL UART 的TX (0-3.3V/5V) 直接接到 RS-232 或 RS-485 接口上,反之亦然!这会损坏接口芯片。
- RS-232 和 RS-485 接口需要专门的电平转换/收发器芯片 (如 MAX232/MAX485)。
- RS-485 总线管理:
- 需要 方向控制(软件控制RE/DE 引脚)。
- 总线两端需要 终端电阻(通常为120Ω),以消除信号反射。
- 注意 总线空闲状态(所有发送器关闭时,需确保总线处于稳定逻辑1状态)。
- 共地问题:
- TTL UART 和 RS-232 要求通信设备间有 良好的公共地线连接,否则地电平差异会导致信号错误甚至损坏。
- RS-485 可通过 隔离型收发器 实现电气隔离,完全消除接地环路干扰的风险。
- 电平转换绝对必需:
总结与应用场景选择
- TTL UART:
- 场景:MCU 与同一电路板或相邻电路板上的传感器、模块(GPS, GSM, 蓝牙)、另一MCU之间的通信;通过USB-TTL适配器与PC进行调试通信。
- 优点:最简硬件(只需引脚),速度可较高,易实现。
- 缺点:距离短,抗干扰差,点对点。
- RS-232:
- 场景:PC/工控机串口连接老式外设(标签打印机、调制解调器、终端);短距离(<15米)、中低速、噪声可控环境下的点对点设备通信。
- 优点:比TTL距离稍远,电平标准化程度高(DB9接口)。
- 缺点:距离速度受限,抗干扰一般,点对点,需要电平转换。
- RS-485:
- 场景:工业自动化(PLC网络、传感器网络如 Modbus RTU)、安防系统(门禁控制)、楼宇自动化(HVAC控制)、电力监控、交通信号控制、长距离数据采集。
- 优点:长距离、强抗干扰、多点网络(多设备总线)。工业领域事实标准。
- 缺点:硬件更复杂(需要收发器芯片、方向控制、终端电阻),软件需管理总线(半双工),速度与距离折衷。
简单决策树:
- 距离短(<2米)、干扰小、点对点? -> 优先 TTL UART (最简单)。
- 距离稍远(<15米)、干扰可控、点对点且对方是标准RS-232口(如PC串口)? -> 选 RS-232。
- 距离远(>15米)、工业噪声环境、需要连接多个设备? -> 必选 RS-485。
常见串口工具
串口调试助手(软件类)
此类工具通过 虚拟串口(如 COM3) 与设备通信,用于收发数据、调试协议。
工具名称 | 平台 | 特点 | 适用场景 |
PuTTY | Windows | 轻量级开源,支持 SSH/Telnet/串口,纯文本界面,无数据解析功能 | 基础调试、Linux 终端访问 |
Tera Term | Windows | 开源免费,支持宏脚本、日志记录,可定制界面 | 自动化测试、长时数据记录 |
SecureCRT | Win/mac/Linux | 商业软件(收费),功能强大:多协议支持、脚本引擎、会话管理 | 企业级调试、复杂会话管理 |
CoolTerm | Win/mac/Linux | 开源免费,简洁易用,支持二进制/HEX 显示,实时绘图 | 快速调试、传感器数据可视化 |
Arduino IDE 串口监视器 | 跨平台 | 内置 Arduino 开发环境,支持简单收发,自动识别开发板端口 | Arduino 项目调试 |
SerialPort Utility | Windows | 免费,支持 MODBUS 解析、数据图表、文件传输 | 工业协议调试、数据分析 |
Termite | Windows | 极简设计,支持 HEX 收发,自动重连 | 快速轻量级调试 |
Picocom | Linux | 命令行工具,支持控制字符转义,适合无 GUI 环境 | Linux 服务器调试 |
Minicom | Linux | 终端式串口工具,功能类似 Windows 超级终端 | Linux 嵌入式开发 |
特殊功能需求:
- 协议解析:选 SerialPort Utility、YAT(Yet Another Terminal)
- 实时绘图:CoolTerm、SerialPlot
- 自动化测试:Tera Term(宏)、Python + PySerial 脚本
协议分析工具(硬件+软件)
捕获原始串口信号,分析时序、错误和物理层问题。
工具 | 类型 | 特点 |
逻辑分析仪 | 硬件设备 | 多通道采集(>8通道),支持 UART/SPI/I2C 协议解码(需配置波特率) |
– Saleae Logic Pro | 商业高端 | 高采样率(1GS/s),直观软件界面 |
– DSView(DreamSourceLab) | 开源方案 | 兼容廉价逻辑分析仪(FX2 芯片),支持 Linux |
专业串口分析仪 | 专用硬件 | 插入通信链路中,记录双向原始数据(如 Total Phase Beagle) |
典型用途:
- 调试时序问题(如起始位宽度异常)
- 检测波特率偏差
- 解决电气干扰问题(需配合示波器)
驱动与虚拟串口管理工具
解决端口冲突、驱动安装问题。
工具 | 功能 |
Windows 设备管理器 | 基础管理:查看 COM 端口、更新驱动、解决冲突 (错误代码 10/12) |
DevManView | 导出所有设备列表,快速查找 USB 转串口芯片型号(如 CP2102) |
COM Port Latency Patch | 修改 Windows 默认串口延迟 (从 16ms→1ms),提升高速传输稳定性 |
socat | Linux 虚拟端口工具(如 socat PTY,link=/dev/ttyVIRT0 PTY,link=/dev/ttyVIRT1) |
ttyd | 网页版串口终端(通过浏览器访问设备) |
硬件工具(关键辅助设备)
工具 | 用途 |
USB 转 TTL 模块 | 连接 MCU 调试(如 FT232R/CH340/CP2102 模块) |
USB 转 RS-232 转换器 | 连接工业设备(如 FT232 + MAX3232 芯片的转换线) |
USB 转 RS-485 转换器 | 接入 MODBUS 总线(注意终端电阻使能) |
串口延长线(带磁环) | 减少长距离干扰(RS-232 建议 <15 米) |
电平转换板 | 解决 3.3V/5V 设备互连问题(如 TI TXB0108) |
开发库(嵌入式/自动化集成)
库名 | 语言 | 应用场景 |
PySerial | Python | 跨平台自动化脚本(数据采集、批量烧录) |
SerialPort.js | JavaScript | 浏览器通过 WebSerial API 控制串口设备 |
libserial | C++ | Linux 嵌入式开发 |
jSerialComm | Java | 跨平台工业控制软件集成 |
工具选择指南
- 基础调试
- Windows:PuTTY / CoolTerm(可视化)
- Linux:screen /dev/ttyUSB0 115200(命令行)
- 工业协议调试
- 选 SerialPort Utility(支持 MODBUS RTU/ASCII 解析)
- 或 YAT(可定制协议插件)
- 长时数据记录
- Tera Term(日志保存 + 时间戳)
- Python + PySerial(自定义格式)
- 底层信号分析
- 逻辑分析仪(<¥200 的 DSView 套装) + PulseView 软件
- 驱动问题排查
- 芯片官网下载驱动(如FTDI | Silabs)
- 用 DevManView 确认硬件 ID