网站建设按期没有完成能要回定金吗,网页设计图片加载不出来,2017 WordPress 主题,建设厅网站生成案卷生成不了1 UART 介绍
UART 是一种以字符为导向的通用数据链#xff0c;可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同#xff0c;通信才能成功。
1.1 UART 通信协议
一个典型的 UART 帧开始…1 UART 介绍
UART 是一种以字符为导向的通用数据链可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同通信才能成功。
1.1 UART 通信协议
一个典型的 UART 帧开始于一个起始位紧接着是有效数据然后是奇偶校验位可有可无最后是停止位。
数据包格式如下
Start Bit
UART 数据传输线在不传输数据时通常保持在高电压电平。要开始传输数据发送 UART 将传输线从高电平拉至低电平一 个时钟周期。当接收 UART 检测到高电压到低电压的转换时它开始以波特率的频率读取数据帧中的位。
Data Frame
数据帧包含正在传输的实际数据。如果使用奇偶校验位它的长度可以是 5 位到 8 位。如果不使用奇偶校验位则数据帧可以是 9 位长。
Parity Bits
奇偶性描述了数字的偶数或奇数。奇偶校验位是接收 UART 判断数据在传输过程中是否发生变化的一种方式。电磁辐射、不匹配的波特率或长距离数据传输可能会改变位。
Stop Bits
为了发出数据包结束信号发送 UART 将数据传输线从低电压驱动到高电压持续 1 到 2 位持续时间。
以下为 Baudrate: 115200, Data Bits: 8, Parity: None, Stop Bits: 1 的波形 2 流控
流主要是解决收发双方速度不匹配的问题。当接收端接收到的数据处理不过来时就向发送端发送不再接收的信号发送端接收到这个信号之后就会停止发送直到收到可以继续发送的信号再继续发送。流控可以控制数据传输的进度进而防止数据丢失。
2.1 硬件流控
硬件流控需要除 RX 和 TX 之外额外增加两根控制线 一根叫 CTSClear To Send为输入信号; 一根叫 RTSRequire To Send, 为输出信号。 这两根线一个是接收控制一个是发送控制。低电平说明可以发送数据高电平代表发送端需要等待。 2.2 软件流控
软件流控是在发送的数据中插入特殊的字符 XON(0x11) 和 XOFF(0x13) 来控制传输。通过插入 XOFF 强制停止发送器发送数据通过插入 XON 强制发送器发送数据。
2.3 区别
硬件流控软件流控硬件需要增加额外 2 跟线硬件不需要改变可以快速停止传输需要等待前面的数据传输完成存在延时不会存在误操作可能存在误识别接收数据与控制字符相同
一般来说在存在可能溢出的环境下优先使用硬件流控。
2.4 UART 与 TTL RS232 的关系
UART 更多关注规定编码格式的标准如波特率baud rate、帧格式和波特率误差等等更像是规定的一种协议。而 RS232、TTL、RS485 这类串行通信接口它们定义了接口不同的电气特性如 RS-232 是单端输入输 出而 RS-485 为差分输入输出等更像是借用此协议的具体的硬件。
TTLRS232RS485电平信号电平信号为 5 V 或者 3.3 V接口的信号电平值较高正负 6-15 V 皆可高低电平由最小差分电压决定传输方式全双工全双工半双工传输距离理论上为 10 英尺5 m抗噪声性能差最远通信距离是 50 英尺15 m差分信号理论通讯距离可达 1200 米
芯片 UART 一般都是 TTL 电平的。
2.5 USB 转 TTL 串口芯片
在实际使用中我们使用电脑的 USB 访问 ESP32 的 UART 外设在这中间就需要一个 USB 转 TTL 串口的芯片以下就是目前常见的一些类型一张表比较它们的各种特性
CP2102/2103CH340系列FT232RPL2303HX生产厂家Silicon南京沁恒FDTIProlific最高速率1 M2 M3 M12 MBit位数5、6、7、85、6、7、87、85、6、7、8校验位奇/偶/1/0/无奇/偶/1/0/无奇/偶/1/0/无奇/偶/1/0/无停止位1、1.5、21、21、21、1.5、2硬件流控有有有有稳定性好好最好差价格中低高低
目前 ESP32 系列开发板上大多集成的是 CP2102。
3 ESP32 UART 硬件
当前 ESP32 系列芯片均集成多个 UART 外设支持异步通信RS232 和 RS485和 IrDA。
以下为不同芯片间 UART 存在的差异。
ESP32ESP32-S2ESP32-S3ESP32-C3ESP32-C2UART 数量32322最大通信速率5 Mbps5 Mbps5 Mbps5 Mbps2.5 Mbps是否支持 DMA是是是是否
从 AT 这边的测试看使用杜邦线最大实际 UART 通信速率可以达到 2 Mbps超过之后数据会有错误 当需要使用更高的通信速率时最好从 PCB 走线。
3.1 常用中断
中断名称简介UART_TX_DONE_INT当发送器发送完 FIFO 中的所有数据时触发此中断UART_RXFIFO_TOUT_INT当接收器接收一个字节的时间大于 UART_RX_TOUT_THRHD 时触发此中断UART_RXFIFO_OVF_INT当接收器接收到的数据量多于 FIFO 的存储量时触发此中断UART_FRM_ERR_INT当接收器检测到数据帧错误时触发此中断UART_PARITY_ERR_INT当接收器检测到校验位错误时触发此中断UART_TXFIFO_EMPTY_INT当发送 FIFO 中的数据量少于 UART_TXFIFO_EMPTY_THRHD 所指定的值时触发此中断UART_RXFIFO_FULL_INT当接收器接收到的数据多于 UART_RXFIFO_FULL_THRHD 所指定的值时触发此中断UART_WAKEUP_INTUART 被唤醒时产生此中断UART_BRK_DET_INT当接收器在停止位之后检测到 NULL 时触发此中断
ESP 芯片的 UART RF FIFO 和 TX FIFO 共用一段 RAM 空间在 IDF 实现中 RX FIFO 和 TX FIFO 相互独立长度均为 128 字节。接收超过 FIFO 最大值之后就会触发 OVF 的溢出中断。
3.2 ESP-IDF 的实现
当前 ESP-IDF 内部使用 UART RF FIFO 的方式进行读写并未使用 UART DMA。但是在 UART 驱动中 TX FIFO 和 RX FIFO 会分别和对应的 ringbuffer 相连。
RX FIFO 在接收到数据后会将数据抛给 RX 的 ringbuffer 并触发 UART_DATA 事件TX 的 ringbuffer 在收到应用层数据后开始将数据发给 TX FIFO 发送
在此期间会通过 UART 事件标识当前的状态UART 事件与中断的对应关系
EventInterruptCommentUART_DATA1. UART_RXFIFO_TOUT_INT2. UART_RXFIFO_FULL_INT1. Timeout: 10 字节传输时间2. Full thresh: 120 字节UART_FIFO_OVFUART_RXFIFO_OVF_INTFIFO 溢出阈值为 128 字节UART_BUFFER_FULL/UART 初始的 RX 的 ringbuffer 值满UART_PATTERN_DETUART_INTR_CMD_CHAR_DEF收到指定数量的特殊字符比如 AT 中的 “”UART_BREAKUART_INTR_BRK_DEF接收到 BREAKUART_FRAME_ERRUART_FRM_ERR_INTUART_PARITY_ERRUART_PARITY_ERR_INTUART_DATA_BREAK/uart_write_bytes_with_break 发送完数据后发送 BREAKUART_WAKEUPUART_WAKEUP_INT
备注 BREAK 信号就是持续一段时间大于一个 UART 帧的低电平。
3.3 常见问题分析 调用 uart_read_bytes 接口读到的数据长度比实际发的数据短 ESP32 系列芯片均使用 FIFO 的方式读写 UART 数据默认在 120 字节时会产生中断解除 uart_read_bytes 的堵塞状态如果发送长度大于 122 字节则可能需要多次调用 UART_READ 接口读取 UART 初始化时配置的 rx_buffer_size 明明很大却出现了丢数据的情况 丢数据是 FIFO 满导致的此时没有及时将数据转出到 rx buffer。一般会触发 UART_FIFO_OVF 此时建议加流控或者将 FULL_THRESH 阈值调低一些。 ESP32 调用休眠接口后 UART 通信异常 ESP32 UART 支持两种时钟源 80 MHz APB_CLK 以及参考时钟 REF_TICK。默认使用 APB_CLK在休眠时此时钟源将会停止工作因此如果需要支持休眠则需要在 UART 初始化时配置 使用 REF_TICK需要注意的是此时钟源只能跑到波特率 115200。