上一篇下一篇SPI 专题目 录UART 专题1简单介绍一下 UART2基础协议内容问答3波特率误差4TX/RX 之外的引脚DTR/RTS/RI/...4.1快速回答4.2详细解释UART 专题参考博客Cortex-M3-STM32F1 开发十八HAL 库开发 ➤ 超详细的串口讲解包括背景知识、UART与RS232和USB通信、USART框图、异步通信配置以及详细的实验示例_hal库串口-CSDN博客一些太基础的这里就不给出了1简单介绍一下 UARTUART 就是最常用的异步串口全双工两根线 TX/RX 加个地。它没有时钟线双方事先约定好波特率比如 115200数据是一帧一帧发的先一个起始位拉低然后发 5~8 个数据位LSB 先发可选的校验位最后至少一位停止位拉高。因为简单可靠大部分模块GPS、蓝牙和调试串口都用它。2基础协议内容问答常见波特率9600 bps低速通信稳定性好……19200 bps中等速度115200 bps常用高速率及其他特殊高速应用常见校验方式无校验不进行校验数据帧最短奇校验数据位加校验位中1的总数为奇数偶校验数据位加校验位中1的总数为偶数标记校验校验位固定为1空格校验校验位固定为03波特率误差误差是什么怎么算最大可接受误差是多少波特率误差就是实际通信速率与标称值之间的偏差公式波特率误差 ∣ 实际波特率 − 理论波特率 ∣ 理论波特率 × 100 % \large 波特率误差\frac{|实际波特率 - 理论波特率|}{理论波特率} × 100\%波特率误差理论波特率∣实际波特率−理论波特率∣​×100%这个偏差可能由发送端产生也可能由接收端产生实际通信中关心的是收发双方的累计误差。理论上双方总误差最大约 ±5%但考虑噪声和设计余量工程上一般要求双方的波特率误差总和不超过 ±2% ~ ±3%。误差是怎么产生的晶振频率偏差晶振本身有精度和温漂。分频取整误差波特率由系统时钟分频得到若时钟不能整除目标波特率舍入误差就会产生例如 8 MHz 产生 115200 时分频系数 69.44 取 69误差约 0.64%。温度、电源波动等环境影响也会进一步恶化时钟。如何减小误差选用高精度、低温漂的晶振如 TCXO。选择合适的晶振频率让分频系数尽量为整数。经典做法就是用11.0592 MHz这类能整除常见波特率的晶振。利用 MCU 的分数分频或小数分频波特率发生器减少取整误差。使用PLL 倍频得到更灵活的时钟源。在应对未知设备时可启用自动波特率检测测量起始位脉宽来推算对方速率实现动态校准。4TX/RX 之外的引脚DTR/RTS/RI/…4.1快速回答握手RTS当本设备准备好接收数据后会控制对方 CTS请求对方发送CTS当对方设备准备好接收数据后会被对方的 RTS 控制表示可以向对方发数据DTR用于告诉对方本设备就绪数据终端就绪DSR用于表示对方设备就绪DCD通常是模块用于告诉 MCU“我已经搜到网络附着基站了”其他RI常用于网络模块有短信、电话或网络数据时输出一个脉冲常作为低功耗场景下唤醒 MCU 的外部中断在低功耗产品中 DTR 和 RI 是两个重要的引脚用于控制模块休眠和唤醒或反过来唤醒MCU。4.2详细解释比如以龙尚的4G模块为例硬件流控制防止接收缓冲区溢出或丢数据主要受接收方控制RTSRequest To Send输出端输出给对方一般高电平表示 “本设备” 已准备好接收数据请求对方发送低电平表示本设备还没准备好接收。简单说就是RTS控制“要不要请对方发给我”一般是推挽输出CTSClear To Send输入端被对方输入一般高电平表示 “对方设备” 已准备好接收数据我方可以发送低电平表示对方还没准备好。简单说就是CTS表示“对方允不允许我发给他”一般是输入上拉/输入下拉不固定接线两个设备的串口对接硬件自动流控设备 A 的 RTS 引脚应连接到设备 B 的 CTS 引脚设备 B 的 RTS 引脚应连接到设备 A 的 CTS 引脚设备A 设备B TX ------------------------------- RX RX ------------------------------- TX RTS ------------------------------- CTS CTS ------------------------------- RTS某个设备的串口的 RTS/CTS 接另一个设备的普通 GPIO软件手动流控发数据前只需要找个 GPIO 读取对方的 RTS即可知道对方能不能接收收数据前只需通过 IO 控制对方 CTS 即可典型应用MCU 与蓝牙/WiFi 模块的高速透传若不使用硬件流控高速率下容易丢字节。当使用硬件流控制时UART 通信流程如下接收端准备好接收数据时会先拉高自己的 RTS 引脚发送端的 CTS 引脚被接收端的 RTS 引脚拉高它知道接收方准备好了那么会开始发数据一旦接收端缓冲区满会拉低自己的 RTS 引脚发送端的 CTS 引脚被接收端的 RTS 引脚拉低会停止发送等待自己的 CTS 再次被拉高后再继续发送。注意如果你的设备不支持硬件流控制或你不使用流控制功能比如只用通信不考虑缓冲或速度控制那么这两个引脚可以不连接或保持悬空。在传统 RS-232 里RTS/CTS常常是“低有效”在很多单片机 UART 里是否高有效/低有效取决于芯片定义或外部收发器所以不要死记“拉高表示允许”要看手册里的有效电平定义。设备就绪状态控制用于表示设备是否已经准备好建立通信即设备状态握手DTRData Terminal Ready输出端输出给对方一般表示“本设备” 已准备好无效时表示本设备还未准备好电平不固定。一般是推挽输出DSRData Set Ready输入端接收对方状态一般表示“对方设备” 已准备好无效时表示对方还未准备好电平不固定。一般是输入模式上拉/下拉不固定取决于硬件设计接线和 RTS/CTS 一样都是交叉连接同样既可以是两个设备的串口对接也可以用普通 GPIO 接 DTR/DSR典型应用PC 串口与外设通信时用于表示主机和外设是否已经就绪某些嵌入式系统中DTR常被复用为复位或进入 BootLoader 的控制信号在一些网络模块中DTR常用来设置模块的唤醒和休眠模式比如 MCU 用普通 GPIO配置为推挽输出连接网络模块的 DTR拉低 DTR 唤醒模块拉高 DTR 让模块进入休眠当然这个也要网络模块支持才行当使用 DTR/DSR 时典型流程如下设备 A 上电并准备好工作后输出有效的 DTR设备 B 的 DSR 检测到该有效电平知道设备 A 已准备好设备 B 如果也准备好了也会输出自己的 DTR设备 A 的 DSR 检测到后知道设备 B 也已准备好双方据此决定是否开始正式通信。注意DTR/DSR 的有效电平也不是绝对固定的传统 RS-232 和单片机 UART/电平转换芯片的定义可能不同实际使用时还是要看芯片手册和原理图。如果设备或协议不使用 DTR/DSR这两个引脚通常可以不接但不能想当然地把它们当成必须参与数据流控制的信号。载波检测/链路状态指示用于表示通信链路是否已经建立现代 MCU UART 中较少使用DCDData Carrier Detect输入端一般表示“对方链路已经建立” 或 “调制解调器已检测到载波信号”简单说就是DCD表示“线路通了可以认为对端在线”注意DCD主要是链路状态信号主要见于传统 RS-232 / Modem 场景现代嵌入式里不常用。振铃提示/来电指示用于提示有呼叫或外部请求到来RIRing Indicator输入端一般表示“有来电” 或 “有外部呼叫请求”典型应用在现代应用中在低功耗的要求下MCU 通过一个普通 GPIO配置成输入连接模块的 RI 没有数据交互的时候 MCU 会进入休眠当网络模块有数据要发给 MCU 时会先通过 RI 引脚触发中断唤醒 MCU 后再发当然这个也要网络模块支持才行。