提示:本博客作为学习笔记,有错误的地方希望指正

文章目录

  • 一、ESP32串口介绍
  • 二、硬件设计
  • 三、实现代码
  • 四、串口实验演示结果
  • 五、ESP32串口函数API
    • 5.1、uart_types.h文件中的内容的API
    • 5.2、在uart.h文件中的内容的API

一、ESP32串口介绍

  UART 是一种以字符为导向的通用数据链,可以实现设备间的通信。异步传输的意思是不需要在发送数据上添加时钟信息。这也要求发送端和接收端的速率、停止位、奇偶校验位等都要相同,通信才能成功。
  一个典型的 UART 帧开始于一个起始位,紧接着是有效数据,然后是奇偶校验位(可有可无),最后是停止位。
  ESP32 上的 UART 控制器支持多种字符长度和停止位。另外,控制器还支持软硬件流控和 DMA,可以实现无缝高速的数据传输。开发者可以使用多个 UART 端口,同时又能保证很少的软件开销。
  ESP32 芯片中有 3 个 UART 控制器可供使用,并且兼容不同的 UART 设备。另外,UART 还可以用作红外数据交换 (IrDA) 或 RS-485 调制解调器。
• 可编程收发波特率
• 3 个 UART 的发送 FIFO 以及接收 FIFO 共享 1024 × 8-bit RAM
• 全双工异步通信
• 支持输入信号波特率自检功能
• 支持 5/6/7/8 位数据长度
• 支持 1/1.5/2/3 个停止位
• 支持奇偶校验位
• 支持 RS485 协议
• 支持 IrDA 协议
• 支持 DMA 高速数据通信
• 支持 UART 唤醒模式
• 支持软件流控和硬件流控
  值得注意的是ESP32的三路串口中串口0不支持引脚的修改默认是GPIO1作为RX,GPIO3作为TX,配置的时候需要注意下,串口0默认使用作为下载程序使用和ESP_LOG的输出。UART1默认引脚是GPIO9用作U1RXD,GPIO10用作U1TXD,但是这两个引脚也是用于外接flash的,因此在使用UART1的时候需要设置其他引脚,UART2默认引脚是GPIO16用作U2RXD,GPIO17用作U2TXD。

二、硬件设计

  这里的硬件设置就是使用的是M5Stack的硬件来实现串口通讯协议实验演示的。

三、实现代码

  这里使用的是官方的uart_event_example_main的Demo进行实验效果的演示。初始化流程数据如下所示。esp32中串口事件的实现是通过接收队列的方式来实现的,通过在安装串口驱动的时候组册事件队列,在任务中等待队列接收到串口事件。

  初始化代码如下

/* UART Events ExampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES ORCONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/uart.h"
#include "esp_log.h"static const char *TAG = "uart_events";/*** This example shows how to use the UART driver to handle special UART events.** It also reads data from UART0 directly, and echoes it to console.** - Port: UART0* - Receive (Rx) buffer: on* - Transmit (Tx) buffer: off* - Flow control: off* - Event queue: on* - Pin assignment: TxD (default), RxD (default)*/#define EX_UART_NUM UART_NUM_0          //定义串口编号宏定义
#define PATTERN_CHR_NUM    (3)          /*!< Set the number of consecutive and identical characters received by receiver which defines a UART pattern*/#define BUF_SIZE (1024)                 //buf大小
#define RD_BUF_SIZE (BUF_SIZE)          //读取字符大小
static QueueHandle_t uart0_queue;       //串口队列static void uart_event_task(void *pvParameters)
{uart_event_t event;size_t buffered_size;uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE); //动态申请内存for(;;) {//Waiting for UART event.                   等待串口事件队列if(xQueueReceive(uart0_queue, (void * )&event, (portTickType)portMAX_DELAY)) {bzero(dtmp, RD_BUF_SIZE);               //清空动态申请的队列ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);switch(event.type) {/*我们最好快速处理数据事件,会有更多的数据事件比其他类型的事件。如果我们在数据事件上花费太多时间,队列可能会充满。*/case UART_DATA:                     // UART接收数据的事件ESP_LOGI(TAG, "[UART DATA]: %d", event.size);uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);  //获取数据ESP_LOGI(TAG, "[DATA EVT]:");uart_write_bytes(EX_UART_NUM, (const char*) dtmp, event.size);  //发送数据break;case UART_FIFO_OVF:                 // 检测到硬件 FIFO 溢出事件 ESP_LOGI(TAG, "hw fifo overflow");//如果fifo溢出发生,你应该考虑为你的应用程序添加流量控制。//ISR已经重置了rx FIFO,例如,我们直接刷新rx缓冲区来读取更多的数据。uart_flush_input(EX_UART_NUM);  //清除输入缓冲区,丢弃所有环缓冲区中的数据xQueueReset(uart0_queue);       //重置一个队列到它原来的空状态。返回值是现在过时,并且总是设置为pdPASS。break;case UART_BUFFER_FULL:              //UART RX 缓冲器满事件ESP_LOGI(TAG, "ring buffer full");// 如果缓冲区满了,你应该考虑增加你的缓冲区大小// 举个例子,我们这里直接刷新 rx 缓冲区,以便读取更多数据。uart_flush_input(EX_UART_NUM);xQueueReset(uart0_queue);       //重置一个队列到它原来的空状态break;case UART_BREAK:                    //UART 中断事件ESP_LOGI(TAG, "uart rx break");break;case UART_PARITY_ERR:               //UART奇偶校验错误事件ESP_LOGI(TAG, "uart parity error");break;case UART_FRAME_ERR:                //UART 帧错误事件ESP_LOGI(TAG, "uart frame error");break;case UART_PATTERN_DET:              //UART 输入样式检测事件uart_get_buffered_data_len(EX_UART_NUM, &buffered_size);    //UART获取RX环缓冲区缓存的数据长度int pos = uart_pattern_pop_pos(EX_UART_NUM);                //返回在缓冲区中最近的检测到的模式位置ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", pos, buffered_size);if (pos == -1) {//曾经有一个UART_PATTERN_DET事件,但是模式位置队列已满,所以它不能//记录位置。我们应该设置更大的队列大小。//例如,我们直接刷新rx缓冲区。uart_flush_input(EX_UART_NUM);  //清除输入缓冲区,丢弃所有环缓冲区中的数据      } else {uart_read_bytes(EX_UART_NUM, dtmp, pos, 100 / portTICK_PERIOD_MS);              //读取数据uint8_t pat[PATTERN_CHR_NUM + 1];                   memset(pat, 0, sizeof(pat));    //清除缓存           uart_read_bytes(EX_UART_NUM, pat, PATTERN_CHR_NUM, 100 / portTICK_PERIOD_MS);   //读取数据ESP_LOGI(TAG, "read data: %s", dtmp);ESP_LOGI(TAG, "read pat : %s", pat);}break;default:                            //其他ESP_LOGI(TAG, "uart event type: %d", event.type);break;}}}free(dtmp);                                     //释放内存dtmp = NULL;                                    //清除内存指针vTaskDelete(NULL);                              //删除任务
}void app_main(void)
{esp_log_level_set(TAG, ESP_LOG_INFO);   //设置ESP32 log打印等级// Configure parameters of an UART driver,      配置串口驱动函数// communication pins and install the driver    通信引脚并安装驱动程序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_DISABLE,      //不使能硬件流控制.source_clk = UART_SCLK_APB,                //时钟源的选择};//Install UART driver, and get the queue.       //安装串口驱动 串口通道 接收buf 发送buf 事件队列 分配中断的标志uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);uart_param_config(EX_UART_NUM, &uart_config);   //串口参数配置//Set UART log levelesp_log_level_set(TAG, ESP_LOG_INFO);           //设置ESP32 log打印等级//Set UART pins (using UART0 default pins ie no changes.)   //设置串口引脚 串口号 发送引脚 接收引脚 rts引脚 cts引脚uart_set_pin(EX_UART_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);//Set uart pattern detect function.             //设置串口参数自检功能uart_enable_pattern_det_baud_intr(EX_UART_NUM, '+', PATTERN_CHR_NUM, 9, 0, 0);//Reset the pattern queue length to record at most 20 pattern positions.uart_pattern_queue_reset(EX_UART_NUM, 20);      //重置模式队列长度,最多记录20个模式位置。//Create a task to handler UART event from ISR  //创建一个任务来处理ISR中的UART事件xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL);
}

四、串口实验演示结果

五、ESP32串口函数API

5.1、uart_types.h文件中的内容的API

  uart_types.h文件中的内容基本上实现的是一些串口协议的设置结构体

// UART端口号,取值为UART_NUM_0 ~ (UART_NUM_MAX -1)。
typedef int  uart_port_t;// UART模式选择
typedef enum {UART_MODE_UART = 0x00,                     /*!< mode:普通UART模式*/UART_MODE_RS485_HALF_DUPLEX = 0x01,        /*!< mode:由RTS引脚控制的半双工RS485 UART模式*/UART_MODE_IRDA = 0x02,                     /*!< mode:IRDA UART模式*/UART_MODE_RS485_COLLISION_DETECT = 0x03,   /*!< mode:RS485碰撞检测UART模式(用于测试目的)*/uart_mod_rs485_app_ctrl = 0x04,            /*!< mode:应用控制RS485 UART模式(用于测试目的)*/
} uart_mode_t;//UART字长常量
typedef enum {UART_DATA_5_BITS = 0x0,    /*!< 5个字节长度 */UART_DATA_6_BITS = 0x1,    /*!< 6个字节长度 */UART_DATA_7_BITS = 0x2,    /*!< 7个字节长度 */UART_DATA_8_BITS = 0x3,    /*!< 8个字节长度 */UART_DATA_BITS_MAX = 0x4,
} uart_word_length_t;//UART停止位数
typedef enum {UART_STOP_BITS_1   = 0x1,   /*!< 1个字节停止位 */UART_STOP_BITS_1_5 = 0x2,   /*!< 1.5个字节停止位 */UART_STOP_BITS_2   = 0x3,   /*!< 2个字节停止位 */UART_STOP_BITS_MAX = 0x4,
} uart_stop_bits_t;//UART奇偶校验常数
typedef enum {UART_PARITY_DISABLE = 0x0,  /*!<禁用UART奇偶校验*/UART_PARITY_EVEN    = 0x2,  /*!<启用UART偶校验*/UART_PARITY_ODD     = 0x3    /*!<启用UART奇偶校验*/
} uart_parity_t;//UART硬件流控制模式
typedef enum {UART_HW_FLOWCTRL_DISABLE = 0x0,/*!<禁用硬件流控制*/UART_HW_FLOWCTRL_RTS = 0x1,    /*!<启用RX硬件流控制(rts)*/UART_HW_FLOWCTRL_CTS = 0x2,    /*!<enable TX硬件流控制(cts)*/UART_HW_FLOWCTRL_CTS_RTS = 0x3,/*!<启用硬件流控制*/UART_HW_FLOWCTRL_MAX = 0 x4,
} uart_hw_flowcontrol_t;//UART信号位图
typedef enum {Uart_signal_inv_disable = 0,           /*!<禁用UART信号逆*/UART_SIGNAL_IRDA_TX_INV = (0x1 << 0),  /*!<反UART irda_tx信号*/UART_SIGNAL_IRDA_RX_INV = (0x1 << 1),  /*!<逆UART irda_rx信号*/UART_SIGNAL_RXD_INV = (0x1 << 2),      /*!<逆UART rxd信号*/UART_SIGNAL_CTS_INV = (0x1 << 3),      /*!<反转UART cts信号*/UART_SIGNAL_DSR_INV = (0x1 << 4),      /*!<反转UART dsr信号*/UART_SIGNAL_TXD_INV = (0x1 << 5),      /*!<逆UART txd信号*/UART_SIGNAL_RTS_INV = (0x1 << 6),      /*!<反转UART rts信号*/UART_SIGNAL_DTR_INV = (0x1 << 7),      /*!<反转UART dtr信号*/
} uart_signal_inv_t;//UART源时钟
typedef enum {UART_SCLK_APB = 0x0,       /*!<来自APB的UART源时钟*/
#if SOC_UART_SUPPORT_RTC_CLKUART_SCLK_RTC = 0x1,       /*!< UART源时钟来自RTC*/
# endif
#if SOC_UART_SUPPORT_XTAL_CLKUART_SCLK_XTAL = 0x2,      /*!< UART源时钟来自XTAL*/
# endif
#if SOC_UART_SUPPORT_REF_TICKUART_SCLK_REF_TICK = 0x3,  /*!< UART源时钟来自REF_TICK*/
# endif
} uart_sclk_t;/*
* @brief 串口AT指令字符配置参数
* 注意此功能在不同芯片上可能不同。请在配置时参考TRM。
*/
typedef struct {uint8_t  cmd_char;      /* !< UART AT命令字符配置参数 */uint8_t  char_num;      /* !< UART AT命令字符重复编号 */uint32_t gap_tout;      /* !< AT命令字符之间的间隔时间(波特率) */uint32_t pre_idle;      /* !< 非AT字符和第一个AT字符之间的空闲时间(波特率) */uint32_t post_idle;     /* !< 最后一个AT字符和无AT字符之间的空闲时间(波特率) */
} uart_at_cmd_t;/**
* @brief UART软件流量控制配置参数
*/
typedef struct {uint8_t xon_char;       /* !< Xon流控制字符*/uint8_t xoff_char;      /* !< Xoff流控制字符*/uint8_t xon_thrd;       /* !<如果启用了软件流控制,并且rxfifo中的数据量小于xon_thrd,则发送一个xon_char */uint8_t xoff_thrd;      /* !<如果使能了软件流控制,并且rxfifo中的数据量大于xoff_thrd,则发送一个xoff_char */
} uart_sw_flowctrl_t;/**
* @brief uart_param_config函数的UART配置参数
*/
typedef struct {int  baud_rate;                 /* !< UART波特率*/uart_word_length_t data_bits;   /* !< UART字节大小*/uart_parity_t parity;           /* !< UART校验模式*/uart_stop_bits_t stop_bits;     /* !< UART停止位*/uart_hw_flowcontrol_t flow_ctrl;/* !< UART HW流量控制模式(cts/rts)*/uint8_t rx_flow_ctrl_thresh;    /* !< UART HW RTS阈值*/union{uart_sclk_t source_clk;     /* !< UART源时钟选择*/bool use_ref_tick __attribute__((deprecated));  /* !已弃用方法来选择ref tick clock source,将source_clk字段改为*/};
} uart_config_t;

5.2、在uart.h文件中的内容的API

  在uart.h文件中的内容就多一些,主要是ESP32串口的配置参数的架构体以及初始化函数和配置函数,还包括了串口事件等参数和函数API。温馨提示:可以给这些API复制到文本编辑器中,例如Vscode中,然后可以快速查找定位即可知道函数功能以及函数参数的含义。

//有效的UART端口号
#define UART_NUM_0 (0)              /*!< UART端口0 */
#define UART_NUM_1 (1)              /*!< UART端口1 */
#if SOC_UART_NUM > 2
#define UART_NUM_2 (2)              /*!< UART端口2 */
# endif
#define UART_NUM_MAX (SOC_UART_NUM) /*!< UART端口max *//* @brief当调用' uart_set_pin ',而不是GPIO number, ' UART_PIN_NO_CHANGE '
*可提供保持当前分配的引脚。*/
#define UART_PIN_NO_CHANGE (1)SOC_UART_FIFO_LEN       //< UART 硬件FIFO的长度
SOC_UART_BITRATE_MAX    //<可配置的最大比特率//UART中断配置参数uart_intr_config函数
typedef struct {uint32_t intr_enable_mask;          /* !< UART中断启用掩码,选择uart_xxxx_int _ena_reg (i)下的UART_XXXX_int _ENA_M,连接位或操作符*/uint8_t rx_timeout_thresh;          /* !< UART超时中断阈值(单位:发送一个字节的时间)*/uint8_t txfifo_empty_intr_thresh;   /* !< UART TX空中断阈值。*/uint8_t rxfifo_full_thresh;         /* !< UART RX全中断阈值。*/
} uart_intr_config_t;//UART事件类型在循环缓冲区中使用
typedef enum {UART_DATA ,                         /*!< UART数据事件*/UART_BREAK ,                        /*!< UART中断事件*/UART_BUFFER_FULL ,                  /*!< UART RX缓冲区完整事件*/UART_FIFO_OVF ,                     /*!< UART FIFO溢出事件*/UART_FRAME_ERR ,                    /*!< UART RX帧错误事件*/UART_PARITY_ERR ,                   /*!< UART RX奇偶校验事件*/UART_DATA_BREAK ,                   /*!< UART TX数据和中断事件*/UART_PATTERN_DET ,                  /*!< 检测到UART模式*/UART_EVENT_MAX ,                    /*!< UART事件最大索引*/
} uart_event_type_t;            //事件结构用于UART事件队列
typedef struct {uart_event_type_t type; /* !< UART事件类型*/size_t size;            /* !< UART_DATA事件的UART数据大小*/bool timeout_flag;      /* !< UART数据读取超时标志UART_DATA事件(在配置RX TOUT期间没有收到新数据)*//* !<如果事件是由FIFO-full中断引起的,那么在下一个字节到来之前将没有带有超时标志的事件*/
} uart_event_t;typedef intr_handle_t uart_isr_handle_t;/*
* @brief安装UART驱动程序并设置UART为默认配置。
* UART ISR处理器将被附加到这个函数运行的同一CPU核心上。
* Rx_buffer_size应该大于UART_FIFO_LEN。Tx_buffer_size应该为零或大于UART_FIFO_LEN。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param rx_buffer_size UART RX环缓冲区大小。
* @param tx_buffer_size UART TX环缓冲区大小。
* 如果设置为0,驱动程序将不会使用TX缓冲区,TX函数将阻塞任务,直到所有数据被发送出去。
* @param queue_size UART事件队列大小/深度。
* @param uart_queue UART事件队列句柄。一旦成功,将在这里编写一个新的队列句柄来提供
* 访问UART事件。如果设置为NULL,驱动程序将不会使用事件队列。
* @param intr_alloc_flags用于分配中断的标志。一个或多个(ORred)
* ESP_intr_FLAG_ *值。更多信息请参见esp_intr_alloc.h。这里没有设置ESP_intr_FLAG_IRAM
* (驱动程序的ISR处理程序不在IRAM中)
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
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, int  intr_alloc_flags);/*
* @brief卸载UART驱动。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_driver_delete (uart_port_t uart_num);/**
* @brief检查驱动是否安装
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* -真正的驱动程序已安装
* -错误的驱动程序没有安装
*/
bool uart_is_driver_installed (uart_port_t uart_num);/**
* 设置UART数据位。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param data_bit UART数据位
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit);/*
* 获取UART数据位配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param data_bit接收UART数据位值的指针。
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success, result将被放入(*data_bit)
*/
esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit);/**
* 获取UART数据位配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param data_bit接收UART数据位值的指针。
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success, result将被放入(*data_bit)
*/
esp_err_t uart_get_word_length(uart_port_t uart_num, uart_word_length_t* data_bit);/**
* 设置UART停止位。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param stop_bits UART停止位
* @return
* - ESP_OK成功
* - ESP_FAIL失败
*/
esp_err_t uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bits);/**
* 获取UART停止位配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param stop_bits接受UART停止位值的指针。
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success,结果将被放入(*stop_bit)
*/
esp_err_t uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t* stop_bits);/**
* @brief设置UART校验模式。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param parity_mode uart奇偶校验配置的enum
* @return
* - ESP_FAIL参数错误
* - ESP_OK成功
*/
esp_err_t uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode);/**
* 获取UART奇偶校验模式配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param parity_mode接受UART奇偶校验模式值的指针。
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success,结果将被放入(*parity_mode)
*/
esp_err_t uart_get_parity(uart_port_t uart_num, uart_parity_t* parity_mode);/**
* 设置UART波特率。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param baudrate UART波特率。
* @return
* - ESP_FAIL参数错误
* - ESP_OK成功
*/
esp_err_t uart_set_baudrate(uart_port_t uart_num, uint32_t baudrate);/**
* 获取UART波特率配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param baudrate接受UART波特率值的指针
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success,结果将被输入(*baudrate)
*/
esp_err_t uart_get_baudrate(uart_port_t uart_num, uint32_t* baudrate);/**
* @brief设置UART线反向模式
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param inverse_mask选择需要反转的连线。使用' uart_signal_inv_t '的ORred掩码
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_line_inverse(uart_port_t uart_num, uint32_t inverse_mask);/**
* @brief设置硬件流控制。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param flow_ctrl硬件流控制模式
* @param rx_thresh硬件RX流量控制阈值(0 ~ UART_FIFO_LEN)。
* 只有当UART_HW_FLOWCTRL_RTS设置时,rx_threshresh值才会被设置。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t flow_ctrl, uint8_t rx_thresh);/**
* @brief设置软件流量控制。
* @param uart_num UART_NUM_0, UART_NUM_1或UART_NUM_2
* @param开启或关闭开关
* @param rx_thresh_xon低水位标记
* @param rx_thresh_xoff高水位
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_sw_flow_ctrl(uart_port_t uart_num, bool enable, uint8_t rx_thresh_xon, uint8_t rx_thresh_xoff);/**
* 获取UART硬件流控制配置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param flow_ctrl选项用于不同的流控制模式。
* @return
* - ESP_FAIL参数错误
* - ESP_OK Success,结果将被放入(*flow_ctrl)
*/
esp_err_t uart_get_hw_flow_ctrl(uart_port_t uart_num, uart_hw_flowcontrol_t* flow_ctrl);/**
* @brief清除UART中断状态
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param clr_mask需要清除的中断状态的位掩码。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_clear_in t_status(uart_port_t uart_num, uint32_t clr_mask);/**
* 设置UART中断使能
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param enable_mask启用位掩码。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask);/*
* @brief清除UART中断启用位
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param disable_mask禁用位的位掩码。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask);/*
* 启用UART RX中断(RX_FULL和RX_TIMEOUT中断)
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_enable_rx_intr (uart_port_t uart_num);/*
* 关闭UART RX中断(RX_FULL和RX_TIMEOUT中断)
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_disable_rx_intr (uart_port_t uart_num);/*
* @brief关闭UART TX中断(TXFIFO_EMPTY中断)
* @param uart_num UART端口号
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_disable_tx_intr (uart_port_t uart_num);/*
打开UART TX中断(TXFIFO_EMPTY中断)
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param启用1:启用;0:禁用
* @param thresh TX中断阈值,0 ~ UART_FIFO_LEN
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_enable_tx_intr(uart_port_t uart_num, int  enable, int  thresh);/*
* 注册UART中断处理器(ISR)。
* @note UART ISR处理器将被附加到这个函数运行的同一CPU核心上。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param fn中断处理函数。
* @param参数参数的处理程序的功能
* @param intr_alloc_flags用于分配中断的标志。一个或多个(ORred)
* ESP_intr_FLAG_ *值。更多信息请参见esp_intr_alloc.h。
* 返回句柄的指针。如果非null,则中断句柄将
* 在这里返回。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_isr_register(uart_port_t uart_num, void (*fn)(void*), void* arg, int  intr_alloc_flags, uart_isr_handle_t *handle);/*
* 免费的UART中断处理程序注册的uart_isr_register。必须在同一个核心调用
* uart_isr_register被调用。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_isr_free (uart_port_t uart_num);/*
* 将UART外设的信号分配给GPIO管脚
* 如果为UART信号配置的GPIO号匹配其中一个
* IOMUX信号为该GPIO,信号将直接连接
* 通过IOMUX。否则GPIO与信号将通过
* GPIO矩阵。例如ESP32通话
* ' uart_set_pin(0,1,3, -1, -1) '被执行,因为GPIO1是UART0的
* 默认的TX引脚和GPIO3是UART0的默认RX引脚,两者都是
* 通过IOMUX分别连接U0TXD和U0RXD,共绕过GPIO矩阵。
* 检查是在每针的基础上执行。因此,有可能
* RX引脚通过GPIO矩阵绑定到GPIO上,而TX是绑定的
* 通过IOMUX连接到GPIO。
* @note内部信号可以输出到多个GPIO板。
* 输入信号只能连接一个GPIO板。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param tx_io_num UART TX引脚GPIO编号。
* @param rx_io_num UART RX引脚GPIO编号。
* @param rts_io_num UART RTS引脚GPIO编号。
* @param cts_io_num UART CTS引脚GPIO编号。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_pin(uart_port_t uart_num, int  tx_io_num, int  rx_io_num, int  rts_io_num, int  cts_io_num);/*
* @brief手动设置UART RTS引脚级别。
* 注意UART必须配置为禁用硬件流控制。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param 1级:RTS输出低(活跃);0: RTS输出高(块)
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_rts(uart_port_t uart_num, int  level);/*
* 手动设置UART DTR引脚级别。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param level 1: DTR输出低;0: DTR输出高
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_dtr(uart_port_t uart_num, int  level);/*
* @brief设置UART空闲间隔后tx FIFO是空的
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param idle_num tx FIFO后的空闲间隔为空(单位:发送一个比特所需的时间)
* 在当前波特率下)
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_set_tx_idle_num(uart_port_t uart_num, uint 16_t idle_num);/*
* @brief UART配置参数。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param uart_config UART参数设置
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config)/**
* 配置UART中断。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param intr_conf UART中断设置
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_intr_config(uart_port_t uart_num, const uart_intr_config_t *intr_conf);/*
* @brief等待直到UART TX FIFO是空的。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param ticks_to_wait超时时间,以RTOS计时计数
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
* - ESP_ERR_TIMEOUT超时时间
*/
esp_err_t uart_wait_tx_done(uart_port_t uart_num, TickType_t ticks_to_wait);/*
* 从给定的缓冲区和长度发送数据到UART端口。
* 这个函数将不会等待足够的空间在TX FIFO。它将填充可用的TX FIFO,并在FIFO满时返回。
* @注意此函数只应在UART TX缓冲区未启用时使用。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param缓冲区数据缓冲区地址
* @param len发送的数据长度
* @return
* -(-1)参数错误
* - OTHERS(>=0)发送到TX FIFO的字节数
*/
int  uart_tx_chars(uart_port_t uart_num, const char* buffer, uint32_t len);/**
* 从给定的缓冲区和长度发送数据到UART端口,
* 如果UART驱动程序的参数tx_buffer_size设置为零:
* 这个函数将不会返回,直到所有的数据已经被发送出去,或至少推入TX FIFO。
* 否则,如果'tx_buffer_size' > 0,这个函数将返回所有的数据复制到tx环缓冲区,
* 然后UART ISR将数据从环形缓冲区逐渐移动到TX FIFO。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param SRC数据缓冲区地址
* @param size发送的数据长度
* @return
* -(-1)参数错误
* - OTHERS(>=0)发送到TX FIFO的字节数
*/
int  uart_write_bytes(uart_port_t uart_num, const void* src, size_t size);/**
* 从给定的缓冲区和长度发送数据到UART端口,
* 如果UART驱动程序的参数tx_buffer_size设置为零:
* 此函数将不会返回,直到所有数据和中断信号已被发送。
* 所有数据发送完毕后,发送中断信号。
* 否则,如果'tx_buffer_size' > 0,这个函数将返回所有的数据复制到tx环缓冲区,
* 然后UART ISR将数据从环形缓冲区逐渐移动到TX FIFO。
* 所有数据发送完毕后,发送中断信号。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param SRC数据缓冲区地址
* @param size发送的数据长度
* @param brk_len中断信号持续时间(单位:在当前波特率下发送一个比特所需的时间)
* @return
* -(-1)参数错误
* - OTHERS(>=0)发送到TX FIFO的字节数
*/
int  uart_write_bytes_with_break(uart_port_t uart_num, const void* src, size_t size, int  brk_len);/*
* @brief UART从UART buffer中读取字节
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param buf指针指向缓冲区。
* @param length数据长度
* @param ticks_to_wait超时时间,以RTOS计时
* @return
* -(-1)错误
* - OTHERS(>=0)从UART FIFO读取的字节数
*/
int  uart_read_bytes(uart_port_t uart_num, void* buf, uint32_t length, TickType_t ticks_to_wait);/*
* @brief uart_flush_input的别名。
* UART环缓冲区冲洗。这将丢弃UART RX缓冲区中的所有数据。
* @note不是等待数据发送,这个函数将清除UART rx缓冲区。
* 为了发送所有的数据在tx FIFO,我们可以使用uart_wait_tx_done函数。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_flush (uart_port_t uart_num);/*
* @brief清除输入缓冲区,丢弃所有环缓冲区中的数据。
* 为了在tx FIFO中发送所有的数据,我们可以使用uart_wait_tx_done函数。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_flush_input (uart_port_t uart_num);/*
* @brief UART获取RX环缓冲区缓存的数据长度
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param size size_t的指针,用于接受缓存数据的长度
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t* size);/*
* @brief UART禁用模式检测功能。
* 专为应用程序如“AT命令”。
* 当硬件检测到一系列相同的字符时,将触发中断。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_disable_pattern_det_intr (uart_port_t uart_num);#if CONFIG_IDF_TARGET_ESP32
/*
* @brief UART启用模式检测功能。
* 专为应用程序如“AT命令”。
* 当硬件检测到一系列相同的字符时,将触发中断。
* @注意此函数仅适用于esp32。此函数已弃用,请使用
* uart_enable_pattern_det_baud_intr代替。
* @param uart_num UART端口号。
* @param pattern_chr模式字符。
* @param chr_num字符数,8位值。
* @param chr_tout每个模式字符之间的间隔超时,24位值,单位是APB (80Mhz)时钟周期。
* 当持续时间小于这个值,它将不接受这个数据作为at_cmd字符。
* @param post_idle最后一个模式字符后的空闲时间,24位值,单位是APB (80Mhz)时钟周期。
* 当持续时间小于这个值,它将不接受前一个数据作为最后一个at_cmd字符
* @param pre_idle第一个模式字符前的空闲时间,24位值,单位是APB (80Mhz)时钟周期。
* 当持续时间小于这个值,它将不接受这个数据作为第一个at_cmd字符。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_enable_pattern_det_intr(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int  chr_tout, int  post_idle, int  pre_idle) __attribute__((deprecated));
# endif/*
* @brief UART启用模式检测功能。
* 专为应用程序如“AT命令”。
* 当硬件检测到一系列相同的字符时,将触发中断。
* @param uart_num UART端口号。
* @param pattern_chr模式字符。
* @param chr_num字符数,8位值。
* @param chr_tout每个模式字符之间的间隔超时时间,16位值,单位是您配置的波特率周期。
* 当持续时间大于这个值,它将不接受这个数据为at_cmd字符。
* @param post_idle最后一个模式字符后的空闲时间,16位值,单位是您配置的波特率周期。
* 当持续时间小于这个值,它将不接受前一个数据作为最后一个at_cmd字符
* @param pre_idle第一个模式字符前的空闲时间,16位值,单位是您配置的波特率周期。
* 当持续时间小于这个值,它将不接受这个数据作为第一个at_cmd字符。
* @return
* - ESP_OK成功
* - ESP_FAIL参数错误
*/
esp_err_t uart_enable_pattern_det_baud_intr(uart_port_t uart_num, char pattern_chr, uint8_t chr_num, int  chr_tout, int  post_idle, int  pre_idle);/*
* 返回在缓冲区中最近的检测到的模式位置。
* 检测到的图案的位置保存在一个队列中,
* 这个函数将退出第一个模式位置,并将指针移动到下一个模式位置。
* 如果RX缓冲区已满且流控制未启用,
* 由于溢出,检测到的模式可能无法在rx缓冲区中找到。
* 以下api将修改模式位置信息:
* uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos
* 确保对模式队列和rx数据缓冲区的原子访问是应用程序的责任
* 当使用模式检测特征。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* -(-1)没有找到当前索引或参数错误的模式
* -其他的模式位置在rx缓冲区。
*/
int  uart_pattern_pop_pos (uart_port_t uart_num);/*
* 返回在缓冲区中最近的检测到的模式位置。
* 检测到的图案的位置保存在一个队列中,
* 这个函数对队列不做任何操作。
* 如果RX缓冲区已满且流控制未启用,
* 由于溢出,检测到的模式可能无法在rx缓冲区中找到。
* 以下api将修改模式位置信息:
* uart_flush_input, uart_read_bytes, uart_driver_delete, uart_pop_pattern_pos
* 确保对模式队列和rx数据缓冲区的原子访问是应用程序的责任
* 当使用模式检测特征。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @return
* -(-1)没有找到当前索引或参数错误的模式
* -其他的模式位置在rx缓冲区。
*/
int  uart_pattern_get_pos (uart_port_t uart_num);/*
* 分配一个给定长度的新内存来保存rx缓冲区中检测到的模式位置。
* @param uart_num UART端口号,最大端口号为(UART_NUM_MAX -1)。
* @param queue_length检测到的模式的最大队列长度。
* 如果队列长度不够大,一些模式位置可能会丢失。
* 设置此值为数据缓冲区可同时保存模式的最大数量。
* @return
* - ESP_ERR_NO_MEM内存不足
* -未安装ESP_ERR_INVALID_STATE驱动程序
* - ESP_FAIL参数错误
* - ESP_OK成功
*/
esp_err_t uart_pattern_queue_reset(uart_port_t uart_num, int  queue_length);/*
* @brief UART设置通信模式
* @note这个函数必须在uart_driver_install()之后,当驱动对象初始化时执行。
* @param uart_num要配置的Uart编号,最大端口号为(UART_NUM_MAX -1)。
* @param mode UART UART模式设置
* @return
* - ESP_OK成功
* - ESP_ERR_INVALID_ARG参数错误
*/
esp_err_t uart_set_mode(uart_port_t uart_num, uart_mode_t mode);/*
* @brief设置RX fifo满的uart阈值
* @note如果应用程序使用更高的波特率,它是观察字节
* 在硬件RX fifo被覆盖,然后这个阈值可以减少
* @param uart_num UART_NUM_0, UART_NUM_1或UART_NUM_2
* @param threshold RX fifo全中断的阈值
* @return
* - ESP_OK成功
* - ESP_ERR_INVALID_ARG参数错误
* -未安装ESP_ERR_INVALID_STATE驱动程序
*/
esp_err_t uart_set_rx_full_threshold(uart_port_t uart_num, int  threshold);/*
* @brief设置uart阈值为空的fifo
* @param uart_num UART_NUM_0, UART_NUM_1或UART_NUM_2
* @param threshold TX fifo空中断产生的阈值
* @return
* - ESP_OK成功
* - ESP_ERR_INVALID_ARG参数错误
* -未安装ESP_ERR_INVALID_STATE驱动程序
*/
esp_err_t uart_set_tx_empty_threshold(uart_port_t uart_num, int  threshold);/**
* @brief UART为TOUT特性设置阈值超时
* @param uart_num要配置的Uart编号,最大端口号为(UART_NUM_MAX -1)。
* @param tout_thresh以uart符号周期定义超时阈值。阈值的最大值为126。
* tout_thresh = 1,定义了TOUT中断超时,等于当前波特率下一个符号(~11位)的传输时间。
* 时间过了会触发UART_RXFIFO_TOUT_int 中断。如果tout_thresh == 0,
* 禁用TOUT功能。
* @return
* - ESP_OK成功
* - ESP_ERR_INVALID_ARG参数错误
* -未安装ESP_ERR_INVALID_STATE驱动程序
*/
esp_err_t uart_set_rx_timeout(uart_port_t uart_num, const uint8_t tout_thresh);/**
* @brief为RS485模式返回碰撞检测标志
* 函数返回碰撞检测标志到collision_flag指向的变量。
* *collision_flag = true,如果检测到碰撞,否则它等于false。
* 这个函数应该在实际传输完成时执行(在uart_write_bytes()之后)。
* @param uart_num配置的最大端口号为(UART_NUM_MAX -1)。
* @param collision_flag bool类型变量的指针,返回碰撞标志。
* @return
* - ESP_OK成功
* - ESP_ERR_INVALID_ARG参数错误
*/
esp_err_t uart_get_collision_flag(uart_port_t uart_num, bool* collision_flag);/**
* 设置RX引脚信号边缘的数量,用于灯光休眠唤醒
* UART可以用来唤醒系统从轻度睡眠。这个特性很有用
* 通过计数RX引脚上的正边的数量,并将计数与
* 阈值。当计数超过阈值时,系统将被唤醒
* 光睡觉。提供阈值设置功能。
* 停止位和奇偶校验位(如果启用)也会影响边缘的数量。
* 例如,ASCII码97的字母“a”在网络上被编码为0100001101
* (与8n1配置),包括启动和停止位。这个序列有3个
* 正边缘(从0过渡到1)。因此,唤醒系统
* 当'a'被发送时,设置wakeup_threshold=3。
* 触发唤醒的字符没有被UART接收(即它不能
* 从UART FIFO获得)。根据波特率,几个字符
* 后即不受理。请注意,当芯片进入和退出
* 轻睡眠模式,APB频率将会改变。确保UART有
* 始终正确的波特率,选择REF_TICK作为UART时钟源,
* 将uart_config_t中的use_ref_tick字段设置为true。
* @note在ESP32中,唤醒信号只能通过IO_MUX(即IO_MUX)输入。
* GPIO3应该配置为function_1来唤醒UART0,
* GPIO9应该配置为function_5来唤醒UART1), UART2
* 不支持轻睡眠唤醒功能。
* @param uart_num UART编号,最大端口号为(UART_NUM_MAX -1)。
* @param wakeup_threshold RX边缘的数量,为轻睡眠唤醒,值为3 ..0 x3ff。
* @return
* - ESP_OK表示成功
* - uart_num不正确或wakeup_threshold不正确时为ESP_ERR_INVALID_ARG
* 在[3,0x3ff]范围之外。
*/
esp_err_t uart_set_wakeup_threshold(uart_port_t uart_num, int  wakeup_threshold);/**
* 获取RX引脚信号边缘的数量为轻睡眠唤醒。
* 关于UART的解释请参见uart_set_wakeup_threshold的描述
* 唤醒功能。
* @param uart_num UART编号,最大端口号为(UART_NUM_MAX -1)。
* @param[out] out_wakeup_threshold输出,设置为wakeup的当前值
* 给定UART的阈值。
* @return
* - ESP_OK表示成功
* -如果out_wakeup_threshold为NULL,则ESP_ERR_INVALID_ARG
*/
esp_err_t uart_get_wakeup_threshold(uart_port_t uart_num, int * out_wakeup_threshold);/**
* @brief等待直到UART tx内存空和最后一个字符发送ok(轮询模式)。
* @param uart_num UART编号
* * @return
* - ESP_OK表示成功
* - ESP_ERR_INVALID_ARG参数错误
* -未安装ESP_FAIL驱动
*/
esp_err_t uart_wait_tx_idle_polling (uart_port_t uart_num);/**
* 配置TX信号回RX模块,仅供测试使用。
* @param uart_num UART编号
* @param loop_back_en设置为true以启用回循环函数,否则设置为false。
* * @return
* - ESP_OK表示成功
* - ESP_ERR_INVALID_ARG参数错误
* -未安装ESP_FAIL驱动
*/
esp_err_t uart_set_loop_back(uart_port_t uart_num, bool loop_back_en);/**
* 配置UART RX超时中断的行为。
* 当always_rx_timeout为true时,即使FIFO已满也会触发超时中断。
* 这个函数可以导致额外的超时中断触发只发送超时事件。
* 只有当你想确保超时中断总是发生在字节流之后,才调用这个函数。
* @param uart_num UART编号
* @param always_rx_timeout_en设置为false启用超时中断的默认行为,
*设置为true总是触发超时中断。
*/
Void uart_set_always_rx_timeout(uart_port_t uart_num, bool always_rx_timeout_en);

ESP32 (UART EVENT)-串口事件学习(1)相关推荐

  1. ESP32 (UART 接收发送)-串口之接收发送通讯(4)

    提示:本博客作为学习笔记,有错误的地方希望指正 文章目录 一.ESP32串口介绍 二.硬件设计 三.实现代码 四.串口实验演示结果 五.ESP32串口函数API 5.1.uart_types.h文件中 ...

  2. ESP32 (UART 485通讯)-串口之485通讯(3)

    提示:本博客作为学习笔记,有错误的地方希望指正 文章目录 一.ESP32串口介绍 二.硬件设计 三.实现代码 四.串口实验演示结果 五.ESP32串口函数API 5.1.uart_types.h文件中 ...

  3. zstack流程梳理与串口事件详解及zigbee调试助手实现细节

    声明:本文撰写时间为2019年6月,能力有限,有错误欢迎批评指正 首先先梳理一遍zstack的流程 协议栈的文件包层次结构: App:应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用 ...

  4. 老宇哥带你玩转 ESP32:04 串口玩起来是真方便

    今天我们来玩儿串口. 概述 ESP32 芯片有3 个 UART 接口,UART0,UART1,UART2,支持异步通信和 IrDA,通信速度最高可达 5Mbps,3 个接口可以被 DMA 或 CPU ...

  5. Echarts数据可视化event图表事件的相关操作,开发全解+完美注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  6. HAL库的串口基础学习(包含串口接收不定长数据的实现)

    HAL库的串口基础学习(1) HAL库有一个特点就是对于许多外设的初始化以及功能操作,都提供有一个weak版本的函数,这是充分的展现出库名字的含义(Hardware Abstraction Layer ...

  7. 合泰HT32 淘晶驰TJC--T0串口屏学习笔记

    串口屏开发环境搭建 串口屏的优点就不用多说了,用过的老师傅都说好! 开发专用上位机软件下载:传送门主要用来设计屏幕界面的,简单方便. 1.软件安装好后点击新建工程 2.选择你需要存放的目录,输入文件名 ...

  8. html event 传递数据,Vue 事件的$event参数=事件的值案例

    这篇文章主要介绍了Vue 事件的$event参数=事件的值案例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 template :min="0" v-model= ...

  9. 串口通信学习(GPS模块)2021.5.10

    GPS串口通信学习实践 2021.5.10 1.串口通信简介 1.1 波特率 1.2 数据位 1.3 停止位 1.4 奇偶校验位 2.GPS模块串口通信配置 2.1 驱动安装 2.2 插入GPS模块 ...

最新文章

  1. PAT甲级1150 Travelling Salesman Problem:[C++题解]旅行商问题、图论
  2. webpack入门启动webpack工程
  3. C++实践参考——OOP版电子词典
  4. 判断字符串是否为JSON
  5. 安卓APP_ 控件(2)—— Button
  6. 第一代计算机主要应用领域为数据处理,第一代计算机主要应用领域为____。    A.数据处理 B.人工智能 C.科学计算 D.过程控制...
  7. 前端学习(707):循环小结
  8. 通过Python脚本理解系统进程间通信
  9. 九大背包问题专题--混合背包问题(状态转移)
  10. NTP服务器的相关配置
  11. JS动态添加HTML元素
  12. 网络安全知识竞赛(国家信息安全水平考试NISP)模拟题1
  13. UOJ #60. 【UR #5】怎样提高智商
  14. 赶快来了解一下职场达人进化论吧,它都有哪些实战技巧?
  15. eclipse访问限制
  16. Docker 之 基操
  17. Lab1 Packet Sniffing and Spoofing Lab
  18. 用c语言编写5颗骰子任意投掷总数为15 的概率,大工15春《应用统计》开卷考试期末复习题...
  19. h5 苹果IOS端 播放mp3 没声音
  20. 用bat批量启动多个软件/程序

热门文章

  1. 3分钟学会Python的for循环语句-生如夏花,Python延年
  2. 木瓜移动携手谷歌云 做出海企业的领航者
  3. 滴滴java开发面经_滴滴 Java研发 社招面经
  4. Java的守护线程和非守护线程
  5. 什么是反向代理,反向代理是如何工作的?
  6. 淘宝天猫官方订单和商品接口操作
  7. 安卓微信指纹java,麻将一下
  8. 小程序直播页面遮罩及按钮设置
  9. 一个月能让“蚊子”“蟑螂”绝子绝孙的秘诀(组图)
  10. 【BZOJ-2503】相框 并查集 + 分类讨论