ESP32之串口(UART)

简介

通用异步接收器/发送器 (UART) 属于一种硬件功能,通过使用 RS232、RS422、RS485 等常见异步串行通信接口来处理通信时序要求和数据帧。UART 是实现不同设备之间全双工或半双工数据交换的一种常用且经济的方式。

ESP32 芯片有三个 UART 控制器(也称为端口),每个控制器都有一组相同的寄存器以简化编程并提高灵活性。

每个 UART 控制器可以独立配置波特率、数据位长度、位顺序、停止位位数、奇偶校验位等参数。所有控制器都与不同制造商的 UART 设备兼容,并且支持红外数据协会 (IrDA) 定义的标准协议。

功能概述

下文介绍了如何使用 UART 驱动程序的函数和数据类型在 ESP32 和其他 UART 设备之间建立通信。基本编程流程分为以下几个步骤:

设置通信参数 — 设置波特率、数据位、停止位等
设置通信管脚 — 分配连接设备的管脚
安装驱动程序 — 为 UART 驱动程序分配 ESP32 资源
运行 UART 通信 — 发送/接收数据
使用中断 — 触发特定通信事件的中断
删除驱动程序 — 如无需 UART 通信,则释放已分配的资源

步骤 1 到 3 为配置阶段,步骤 4 为 UART 运行阶段,步骤 5 和 6 为可选步骤。

UART 驱动程序函数通过 uart_port_t 识别不同的 UART 控制器。调用以下所有函数均需此标识。

设置通用参数

UART 通信参数可以在一个步骤中完成全部配置,也可以在多个步骤中单独配置。

一次性配置所有参数

调用函数 uart_param_config() 并向其传递 uart_config_t 结构体,uart_config_t 结构体应包含所有必要的参数。请参考以下示例。

const uart_port_t uart_num = UART_NUM_2;
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,
.rx_flow_ctrl_thresh = 122,
};
// Co
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要确保STM32和ESP32都有UART串口通信功能,并且它们的波特率、数据位、停止位、校验位等参数都一致。 接着,在STM32的程序中,需要使用UART的发送函数将字符串发送给ESP32。具体实现步骤如下: 1. 初始化UART串口,设置波特率、数据位、停止位、校验位等参数。 2. 编写发送函数,将字符串转换成字符数组,然后使用UART的发送函数逐个发送字符。 3. 在ESP32的程序中,同样需要初始化UART串口,并设置相同的波特率、数据位、停止位、校验位等参数。 4. 编写接收函数,不断读取UART串口接收缓存区中的数据,直到读取到结束符(例如'\0')为止。然后将接收到的字符串打印出来。 下面是一个简单的示例代码,实现了STM32向ESP32发送字符串,并在ESP32上打印接收到的字符串。 STM32程序: ```c #include "stm32f10x.h" #include <stdio.h> #define UART_TX_PIN GPIO_Pin_9 #define UART_RX_PIN GPIO_Pin_10 void UART_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = UART_TX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = UART_RX_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void UART_SendString(char *str) { while (*str) { USART_SendData(USART1, *str++); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } } int main(void) { UART_Init(); char *str = "Hello, ESP32!\n"; UART_SendString(str); while (1); } ``` ESP32程序: ```c #include "driver/uart.h" #include <stdio.h> #define UART_NUM UART_NUM_2 #define UART_BAUDRATE 115200 void UART_Init(void) { uart_config_t uart_config = { .baud_rate = UART_BAUDRATE, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; ESP_ERROR_CHECK(uart_param_config(UART_NUM, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(UART_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); ESP_ERROR_CHECK(uart_driver_install(UART_NUM, 1024, 0, 0, NULL, 0)); } void UART_ReceiveString(char *buf, int len) { int i = 0; while (i < len - 1) { int n = uart_read_bytes(UART_NUM, (uint8_t*)buf + i, 1, pdMS_TO_TICKS(10)); if (n == 1) { if (buf[i] == '\0') { break; } i++; } } buf[i] = '\0'; } void app_main(void) { UART_Init(); char buf[1024]; UART_ReceiveString(buf, sizeof(buf)); printf("%s", buf); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值