【ESP32学习笔记】#外设篇#(3)串口通信(UART)
一、简介
- 官方文档:UART
- ESP32 有 3 个 UART 控制器(
UART0
、UART1
和UART2
),它们具有一组相同的寄存器。 - 每个 UART 控制器均可独立配置参数,如波特率、数据位长度、位排序、停止位数量、奇偶校验位等。
- 支持异步通信(RS232 和 RS485)和 IrDA。
- 通信速率可达到 5 Mbps。
- 支持 CTS 和 RTS 信号的硬件管理以及软件流控(XON 和 XOFF)。
- 3 个接口均可被 DMA 访问或者 CPU 直接访问。
- 全双工异步通信
- 支持 UART 唤醒模式
- 支持波特率自检测功能
- UART 有两个时钟源:80-MHz
APB_CLK
以及参考时钟REF_TICK
- 3 个 UART 的发送 FIFO 以及接收 FIFO 共享 1024 × 8-bit RAM。
UART 共享 RAM 图:
二、配置和使用
1、初始化示例:
const int uart_num = UART_NUM_0;
uart_config_t uart_config = {.baud_rate = 115200, // 波特率.data_bits = UART_DATA_8_BITS, // 数据位.parity = UART_PARITY_DISABLE, // 奇偶校验模式.stop_bits = UART_STOP_BITS_1, // 停止位// .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS, // 硬件流控模式(cts/rts)// .rx_flow_ctrl_thresh = 122, // 硬件 RTS 阈值// .source_clk = , // 源时钟选择
};
/* 设置 UART 通讯参数 */
uart_param_config(uart_num, &uart_config);/* 设置 UART 引脚 */
uart_set_pin(uart_num , GPIO_NUM_1, GPIO_NUM_3, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);/* 安装驱动程序 */
const int uart_buffer_size = (1024 * 2);
QueueHandle_t uart_queue;
uart_driver_install(uart_num , uart_buffer_size, uart_buffer_size, 10, &uart_queue, 0));// uart_isr_free(uart_num ); //释放中断服务函数
2、发送示例:
char* test_str = "Hello World.\n";// 发送函数1
uart_write_bytes(uart_num, (const char*)test_str, strlen(test_str));// 发送函数2 uart_tx_chars 函数不会在 TX FIFO 中等待足够的空间// 发送函数3 传输结束时增加一个串行中断信号 相当于帧与帧之间增加间隔
uart_write_bytes_with_break(uart_num, "test break\n",strlen("test break\n"), 100);// 等待发送完成
ESP_ERROR_CHECK(uart_wait_tx_done(uart_num, 100));
3、接收示例:
// Read data from UART.
const int uart_num = UART_NUM_0;
uint8_t data[128];
int length = 0;
ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length));
length = uart_read_bytes(uart_num, data, length, 100);
4、自定义中断示例:
const int uart_num = UART_NUM_0;
uart_isr_handle_t handle;
// 重新注册自定义中断服务函数,不使用内部中断处理程序
uart_isr_register(uart_num, uart_irq_handler, &uart_num, ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM, &handle);
// 使能中断接收 打开 rxfifo接收满中断,rxfifo超时中断(默认超时时间为10个byte)
uart_enable_rx_intr(uart_num );
uart_set_rx_timeout(uart_num, 20); //配置接收超时中断时间,单位为按照当前波特率传输1个bytes的时间// 中断处理
static void IRAM_ATTR uart_irq_handler(void *arg) {volatile uart_dev_t *uart = arg;uint8_t recSize=0;int uartRxCount = 0;uint8_t uartRxBuf[100];uart->int_clr.rxfifo_full = 1;uart->int_clr.frm_err = 1;if(uart->int_st.rxfifo_tout) //检查是否产生超时中断{uart->int_clr.rxfifo_tout = 1;recSize = uart->status.rxfifo_cnt;if(recSize!=0){while(uart->status.rxfifo_cnt){uartRxBuf[uartRxCount++] = uart->fifo.rw_byte; }} }
}
三、官方使用示例
peripherals/uart/
代码示例 | 描述 |
---|---|
uart_echo | 配置 UART 设置、安装 UART 驱动程序以及通过 UART1 接口读取/写入。 |
uart_events | 使用模式检测中断报告各种通信事件。 |
uart_async_rxtxtasks | 通过同一个 UART 在两个独立的 FreeRTOS 任务中发送和接收数据。 |
uart_select | 对 UART 文件描述符使用同步 I/O 多路复用。 |
uart_echo_rs485 | 设置 UART 驱动程序以在半双工模式下通过 RS485 接口进行通信。此示例类似于外设/uart/uart_echo,但允许通过连接到 ESP32 引脚的 RS485 接口芯片进行通信。 |
nmea0183_parser | 通过解析通过 UART 外设从 GPS 接收到的 NMEA0183 数据来获取 GPS 信息。 |
四、API
driver/uart.h
API | 描述 |
---|---|
uart_driver_install
|
安装 UART 驱动程序并将 UART 设置为默认配置 |
uart_driver_delete
|
卸载UART驱动 |
uart_is_driver_installed
|
检查驱动程序是否安装 |
uart_set_word_length
|
设置 UART 数据位 |
uart_get_word_length
|
获取 UART 数据位配置 |
uart_set_stop_bits
|
设置 UART 停止位 |
uart_get_stop_bits
|
获取 UART 停止位配置 |
uart_set_parity
|
设置 UART 奇偶校验模式 |
uart_get_parity
|
获取 UART 奇偶校验模式配置 |
uart_set_baudrate
|
设置 UART 波特率 |
uart_get_baudrate
|
获取 UART 波特率配置 |
uart_set_line_inverse
|
设置 UART 线路反转模式 |
uart_set_hw_flow_ctrl
|
设置硬件流控制 |
uart_set_sw_flow_ctrl
|
设置软件流控制 |
uart_clear_intr_status
|
清除 UART 中断状态 |
uart_enable_intr_mask
|
设置 UART 中断使能 |
uart_disable_intr_mask
|
清除 UART 中断使能位 |
uart_enable_rx_intr
|
启用 UART RX 中断 (RX_FULL & RX_TIMEOUT INTERRUPT) |
uart_disable_rx_intr
|
禁用 UART RX 中断 (RX_FULL & RX_TIMEOUT INTERRUPT) |
uart_disable_tx_intr
|
禁用 UART TX 中断 (TX_FULL & TX_TIMEOUT INTERRUPT) |
uart_enable_tx_intr
|
启用 UART TX 中断 (TX_FULL & TX_TIMEOUT INTERRUPT) |
uart_isr_register
|
注册 UART 中断处理程序 (ISR) |
uart_isr_free
|
释放由 uart_isr_register 注册的 UART 中断处理程序 |
uart_set_pin
|
设置 UART 引脚编号 |
uart_set_rts
|
手动设置 UART RTS 引脚电平 |
uart_set_dtr
|
手动设置 UART DTR 引脚电平 |
uart_set_tx_idle_num
|
在 tx FIFO 为空后设置 UART 空闲间隔 |
uart_param_config
|
设置 UART 配置参数 |
uart_intr_config
|
配置 UART 中断 |
uart_wait_tx_done
|
等到 UART TX FIFO 为空 |
uart_tx_chars
|
从给定的缓冲区和长度将数据发送到 UART 端口 |
uart_write_bytes
|
从给定的缓冲区和长度向 UART 端口发送数据 |
uart_write_bytes_with_break
|
从给定的缓冲区和长度向 UART 端口发送数据 |
uart_read_bytes
|
UART 从 UART 缓冲区读取字节 |
uart_flush
|
uart_flush_input 的别名。UART 环形缓冲区刷新。会删除 UART RX 缓冲区中的所有数据。 |
uart_flush_input
|
清除输入缓冲区,删除环形缓冲区中的所有数据。 |
uart_get_buffered_data_len
|
UART 获取 RX 环形缓冲区缓存的数据长度 |
uart_disable_pattern_det_intr
|
UART 禁用模式检测功能。专为“AT 命令”等应用而设计。当硬件检测到一系列相同的字符时,就会触发中断。 |
uart_enable_pattern_det_intr
|
UART 使能模式检测功能。专为“AT 命令”等应用而设计。当硬件检测到一系列相同的字符时,就会触发中断。 |
uart_enable_pattern_det_baud_intr
|
UART 使能模式检测功能。专为“AT 命令”等应用而设计。当硬件检测到一系列相同的字符时,就会触发中断。 |
uart_pattern_pop_pos
|
返回缓冲区中最近检测到的模式位置 |
uart_pattern_get_pos
|
返回缓冲区中最近检测到的模式位置。 |
uart_pattern_queue_reset
|
分配一个给定长度的新内存来保存记录在 rx 缓冲区中检测到的模式位置 |
uart_set_mode
|
UART 设置通信模式 |
uart_set_rx_full_threshold
|
设置 RX fifo full 的 UART 阈值 |
uart_set_tx_empty_threshold
|
为 TX fifo 为空设置 UART 阈值 |
uart_set_rx_timeout
|
UART 设置 TOUT 功能的阈值超时 |
uart_get_collision_flag
|
返回 RS485 模式的碰撞检测标志 函数将碰撞检测标志返回到由碰撞标志指向的变量中。 |
uart_set_wakeup_threshold
|
设置浅睡眠唤醒的 RX 引脚信号边沿数 |
uart_get_wakeup_threshold
|
获取浅睡眠唤醒的 RX 引脚信号边沿数 |
uart_wait_tx_idle_polling
|
等到 UART tx 内存为空并且最后一个字符发送正常(轮询模式) |
uart_set_loop_back
|
配置TX信号环回RX模块,仅供测试使用 |
uart_set_always_rx_timeout
|
配置 UART RX 超时中断的行为 |
五、报错:
问题一:
uart: uart_read_bytes(1156): uart driver error
解决:
没有初始化该串口,初始化一下
问题二:
uart: uart_driver_install(1284): uart tx buffer length error(>128 or 0)
解决:
发送缓冲区太小。应 >128 or 0
注:Rx_buffer_size 应该大于 UART_FIFO_LEN。Tx_buffer_size 应为零或大于 UART_FIFO_LEN
问题三:
Guru Meditation Error: Core 0 panic'ed (LoadProhibited). Exception was unhandled
uart_driver_install
函数:
#define UART_FULL_THRESH_DEFAULT (120)uart_intr_config_t uart_intr = {.intr_enable_mask = UART_INTR_CONFIG_FLAG,.rxfifo_full_thresh = UART_FULL_THRESH_DEFAULT,.rx_timeout_thresh = UART_TOUT_THRESH_DEFAULT,.txfifo_empty_intr_thresh = UART_EMPTY_THRESH_DEFAULT,
};
默认值 120,只能接收到120个字节就中断。
【ESP32学习笔记】#外设篇#(3)串口通信(UART)相关推荐
- AutoLeaders控制组——51单片机学习笔记(定时器、串口通信)
本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...
- 树莓派学习笔记(五)串口通信
观看学习上官可编程陈立臣老师的树莓派视频, 在其过程中所记录的学习笔记 一.串口通信概念 1.串口通信用于多机通信 2.串口通信属于全双工通信,即双方可以同时进行交流 ...
- ESP32学习记录<三>串口通信
ESP32学习记录<三>串口通信 文章目录 ESP32学习记录<三>串口通信 前言 一.通过串口打印出数据 1.初始化串口 2.打印数据 二.串口控制LED亮灭 1.接收串口发 ...
- FPGA学习笔记(四)——串口通信之接收数据(调试过程)
本学习笔记主要参考小梅哥B站教学视频,网址如下: https://www.bilibili.com/video/BV1va411c7Dz?p=1 使用的编译器为Vivado,HDL语言为verilog ...
- 【学习笔记】stm32+openmv串口通信实现颜色识别
个人笔记.这是之前的一个实验,现在把它整理出来. 本实验用的是stm32h743和openmv作为硬件,实现用openmv识别出我们想要的颜色,将获取的颜色坐标和目标区域的宽.高 通过串口发送给 st ...
- ESP32学习笔记( VSCode + ESP-IDF环境) 3 ——GPIO相关的简单外设驱动
1.如何在VSCode和ESP-IDF的环境下创建工程 说实话,这是我用ESP-IDF在VSCode环境下最不喜欢的事情,在一顿CSDN和百度之后,很多大佬博主都推荐使用VSCode,通过官方示例来进 ...
- ESP32学习笔记(七) 复位和时钟
ESP32学习笔记(七) 复位和时钟 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介绍 ...
- ESP32学习笔记(一) 芯片型号介绍
ESP32学习笔记(一) 芯片型号介绍 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介 ...
- ESP32学习笔记(30)——BLE GATT服务端自定义服务和特征
一.简介 1.1 低功耗蓝牙(BLE)协议栈 链路层(LL) 控制设备的射频状态,有五个设备状态:待机.广播.扫描.初始化和连接. 广播 为广播数据包,而 扫描 则是监听广播. GAP通信中角色,中心 ...
- ESP32学习笔记(27)——BLE GAP主机端扫描
一.背景 1.1 低功耗蓝牙(BLE)协议栈 链路层(LL) 控制设备的射频状态,有五个设备状态:待机.广播.扫描.初始化和连接. 广播 为广播数据包,而 扫描 则是监听广播. GAP通信中角色,中心 ...
最新文章
- Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
- 个人理财助手2009 V2.4
- anaconda安装shapefile_Anaconda3详细安装使用教程及问题总结
- C#中值类型和引用类型的区别
- rtrim()正确的理解啊
- 简短的计算机病毒,最简单的电脑病毒
- ANC降噪耳机声学参数合成与校准的2种方式
- 公众号html5页面代码,微信公众号网页H5跳转微信小程序
- vr全景拍摄教程,怎样拍摄vr全景照片?
- 网站被挂马了怎么办?
- c语言 calloc ,realloc 的使用
- 电大本科计算机论文要求,【最新要求】电大毕业论文格式要求
- 丈母娘刚需支撑中国经济
- 三星S11首曝光/2019款iPhone预测价格出炉
- MPAndroidChart的详细使用——BarChart条形图(二)
- C/C++笔试必须熟悉掌握的头文件系列(九)——string
- 利用OpenMP加速拉伸图像操作
- 如何用U盘安装Linux系统
- CUDN安装+pytorch
- Unity街机横版格斗(恐龙快打)插件-Beat Em Up Template 3D 1.3(附下载连接)