ESP8266学习历程(6)——UART

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指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 < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);

    if (uart_num == UART_NUM_1) {
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO2_U, FUNC_U1TXD_BK);
    } else {
        PIN_PULLUP_DIS(PERIPHS_IO_MUX_U0TXD_U);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD);
        PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0TXD_U, FUNC_U0TXD);

        if (uart_conf->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 <stdio.h>
#include <stdlib.h>
#include <string.h>

#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

发布了33 篇原创文章 · 获赞 1 · 访问量 672

猜你喜欢

转载自blog.csdn.net/qq_41714908/article/details/105254824
今日推荐