ESP8266学习历程(6)——UART

Vala ·
更新时间:2024-11-10
· 520 次阅读

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。

数据格式;一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

平常使用类似STM32这种平台使用串口一般是用来做调试或者外接一些模块比如:蓝牙、超声波等等,同样ESP8266针对串口这块提供的接口也是特别多,本文只针对主要的几个关键函数进行解析;

头文件

#include "driver/uart.h"

SDK中提供的接口与STM32的串口配置大同小异,无外乎就是配置串口的波特率、数据位、停止位、奇偶校验位等等,再者就还有串口中断配置如接收中断、发送中断、超时中断等等。

串口配置结构体

typedef struct { int baud_rate; /*!< 串口波特率 */ uart_word_length_t data_bits; /*!< 字长(数据位)*/ uart_parity_t parity; /*!< 奇偶校验位 */ uart_stop_bits_t stop_bits; /*!< 停止位 */ uart_hw_flowcontrol_t flow_ctrl; /*!< UART硬件流控制模式(cts / rts) */ uint8_t rx_flow_ctrl_thresh; /*!< 设置串口RTS阈值 */ } uart_config_t;

简单的使用起来就两个步骤:

串口相关参数的配置 安装UART驱动程序

通过以上两步就可以通过串口进行读写了;

串口相关参数配置

当我们创建一个uart_config_t uart_config的结构体进行配置后,只需要调用一个函数即可完成配置;

UART参数配置函数

*esp_err_t uart_param_config(uart_port_t uart_num, uart_config_t uart_conf)

参数 解析
uart_num 要配置的Uart号
uart_conf uart_config_t结构体

函数原型如下:

esp_err_t uart_param_config(uart_port_t uart_num, uart_config_t *uart_conf) { UART_CHECK((uart_num flow_ctrl & UART_HW_FLOWCTRL_RTS) { PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_U0RTS); } if (uart_conf->flow_ctrl & UART_HW_FLOWCTRL_CTS) { PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_UART0_CTS); } uart_set_hw_flow_ctrl(uart_num, uart_conf->flow_ctrl, uart_conf->rx_flow_ctrl_thresh); } uart_set_baudrate(uart_num, uart_conf->baud_rate); //波特率 uart_set_word_length(uart_num, uart_conf->data_bits); //字长 uart_set_stop_bits(uart_num, uart_conf->stop_bits); //停止位 uart_set_parity(uart_num, uart_conf->parity); //奇偶校验位 uart_reset_rx_fifo(uart_num); return ESP_OK; }

不难看出,该函数调用了单独配置给各种参数的接口,算是一个串口配置的结合函数,使用起来十分方便,但是如果想要对单独的某个设置进行配置的话,也可以使用对应的接口去配置。

安装UART驱动程序

类似于GPIO配置中开启GPIO中断一样,中断服务需要通过一个函数来进行安装,串口在配置完成后,也需要进行串口服务安装,调用以下函数。

esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int queue_size, QueueHandle_t *uart_queue);
参数 解析
uart_num Uart端口号
rx_buffer_size UART 接收缓冲区的大小
tx_buffer_size UART 发送缓冲区的大小。如果设置为零,驱动程序将不使用TX缓冲区,TX函数将阻塞任务,直到所有数据都已发送出去,即需要发送完后才能执行别的工作
queue_size UART事件队列的大小/深度
uart_queue UART事件队列句柄(输出参数)。如果成功,这里将写入一个新的队列句柄来提供对UART事件的访问。如果设置为NULL,驱动程序将不使用事件队列。

用例:实现蓝牙接收并打印(这里用的蓝牙4.0波特率是9600,所以为了避免看到乱码,需要在make menuconfig中设置monitor的波特率为9600)

#include #include #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" static const char *TAG = "bluetooth test"; static void ble_task(void *arg) { uart_config_t uart_config = { .baud_rate = 9600, //蓝牙波特率 .data_bits = UART_DATA_8_BITS, //8位数据位 .parity = UART_PARITY_DISABLE, //无奇偶校验 .stop_bits = UART_STOP_BITS_1, //1位停止位 .flow_ctrl = UART_HW_FLOWCTRL_DISABLE //无硬件流 }; uart_param_config(UART_NUM_0, &uart_config); //配置初始化 uart_driver_install(UART_NUM_0, 1024 * 2, 0, 0, NULL); //安装串口驱动 uint8_t *pBuff = (uint8_t *) malloc(1024); while (1) { memset(pBuff, 0, 1024); int len = uart_read_bytes(UART_NUM_0, pBuff, 1024, 20 / portTICK_RATE_MS); if(len > 0) ESP_LOGI(TAG, "pBuff : %s\n", pBuff); } } void app_main(void) { xTaskCreate(ble_task, "uart_ble_task", 1024, NULL, 10, NULL); }

结果:

在这里插入图片描述
说明:官方提供的UART的接口可不止这里介绍的这点,详见头文件下的接口说明,这类博文只是快速拉一遍ESP8266的基础学习而已,要深入了解还是去看看官方提供的接口,这里讲不完太多了。

我的GITHUB

我的个人博客

CSDN


作者:大大棋



esp8266 uart esp 学习

需要 登录 后方可回复, 如果你还没有账号请 注册新账号