日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

ESP32學習筆記(4)——UART串口使用

發(fā)布者:知識的海洋最新更新時間:2025-03-04 來源: jianshu關(guān)鍵字:ESP32  UART  串口使用 手機看文章 掃描二維碼
隨時隨地手機看文章

一、概述

通用異步收發(fā)送器(UART)是一種硬件特性,它使用廣泛適應(yīng)的異步串行通信接口(如RS 232、RS 422、RS 485)來處理通信(即時序要求和數(shù)據(jù)幀)。UART提供了一種廣泛采用和廉價的方法來實現(xiàn)不同設(shè)備之間的全雙工或半雙工數(shù)據(jù)交換。

ESP32芯片有三個UART控制器(UART 0、UART 1和UART 2),它們具有一組相同的寄存器,以便于編程和靈活性。

每個UART控制器都是獨立配置的,參數(shù)包括波特率、數(shù)據(jù)比特長度、位序、停止位數(shù)、奇偶校驗位等。所有控制器都與不同廠商的UART支持設(shè)備兼容,還可以支持紅外數(shù)據(jù)關(guān)聯(lián)協(xié)議(IRDA)。

ESP-IDF 編程指南——UART

二、API說明

以下 UART 接口位于 driver/include/driver/uart.h。

2.1 uart_param_config

2.2 uart_driver_install

2.3 uart_read_bytes

2.4 uart_write_bytes

2.5 uart_set_pin

ESP32的串口是支持引腳映射的,比如我的開發(fā)板串口一默認的是GPIO9和GPIO10,現(xiàn)在將TX、RX映射到GPIO4和GPIO5上。

三、編程流程

3.1 設(shè)置通信參數(shù)

如設(shè)置波特率、數(shù)據(jù)位、停止位等

在結(jié)構(gòu)體中進行配置:


typedef struct {

    int baud_rate;                      /*!< UART baud rate*/

    uart_word_length_t data_bits;       /*!< UART byte size*/

    uart_parity_t parity;               /*!< UART parity mode*/

    uart_stop_bits_t stop_bits;         /*!< UART stop bits*/

    uart_hw_flowcontrol_t flow_ctrl;    /*!< UART HW flow control mode (cts/rts)*/

    uint8_t rx_flow_ctrl_thresh;        /*!< UART HW RTS threshold*/

    union {

        uart_sclk_t source_clk;         /*!< UART source clock selection */

        bool use_ref_tick  __attribute__((deprecated)); /*!< Deprecated method to select ref tick clock source, set source_clk field instead */

    };} uart_config_t;

3.2 設(shè)置通信引腳

ESP32的串口是支持引腳映射的,比如我的開發(fā)板串口一默認的是GPIO9和GPIO10,現(xiàn)在將TX、RX映射到GPIO4和GPIO5上。


請調(diào)用函數(shù)uart_set_pin()并指定驅(qū)動程序應(yīng)將Tx,Rx,RTS和CTS信號路由至的GPIO引腳號。


如果要為特定信號保留當前分配的管腳號,請傳遞宏UART_PIN_NO_CHANGE。


應(yīng)該為不使用的引腳指定相同的宏。


// Set UART pins(TX: IO17 (UART2 default), RX: IO16 (UART2 default), RTS: IO18, CTS: IO19)ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, 18, 19));

3.3 驅(qū)動程序安裝

設(shè)置好通信引腳后,通過調(diào)用安裝驅(qū)動程序uart_driver_install()并指定以下參數(shù):


Tx環(huán)形緩沖區(qū)的大小


Rx環(huán)形緩沖區(qū)的大小


事件隊列句柄和大小


分配中斷的標志


該功能將為UART驅(qū)動程序分配所需的內(nèi)部資源。


// Setup UART buffered IO with event queueconst int uart_buffer_size = (1024 * 2);QueueHandle_t uart_queue;// Install UART driver using an event queue hereESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, uart_buffer_size,

                                        uart_buffer_size, 10, &uart_queue, 0));

3.4 運行UART通信

串行通信由每個UART控制器的有限狀態(tài)機(FSM)控制。


發(fā)送數(shù)據(jù)的過程涉及以下步驟:


將數(shù)據(jù)寫入Tx FIFO緩沖區(qū)


FSM序列化數(shù)據(jù)


FSM將數(shù)據(jù)發(fā)送出去


接收數(shù)據(jù)的過程類似,但是步驟相反:


FSM處理傳入的串行流并將其并行化


FSM將數(shù)據(jù)寫入Rx FIFO緩沖區(qū)


從Rx FIFO緩沖區(qū)讀取數(shù)據(jù)


因此,應(yīng)用程序?qū)⒈幌拗茷榉謩e使用uart_write_bytes()和從相應(yīng)的緩沖區(qū)寫入和讀取數(shù)據(jù)uart_read_bytes(),而FSM將完成其余的工作。


3.4.1 發(fā)送

準備好要傳輸?shù)臄?shù)據(jù)后,調(diào)用該函數(shù)uart_write_bytes()并將數(shù)據(jù)緩沖區(qū)的地址和數(shù)據(jù)長度傳遞給該函數(shù)。該函數(shù)將數(shù)據(jù)復(fù)制到Tx環(huán)形緩沖區(qū)(立即或在有足夠空間可用之后),然后退出。當Tx FIFO緩沖區(qū)中有可用空間時,中斷服務(wù)程序(ISR)將數(shù)據(jù)從Tx環(huán)形緩沖區(qū)移至后臺的Tx FIFO緩沖區(qū)。下面的代碼演示了此功能的用法。


// Write data to UART.char* test_str = 'This is a test string.n';uart_write_bytes(uart_num, (const char*)test_str, strlen(test_str));

該功能uart_write_bytes_with_break()類似于uart_write_bytes()但在傳輸結(jié)束時添加了一個串行中斷信號。意味著它會在發(fā)送完數(shù)據(jù)之后,設(shè)置TX低電平一段時間(RTOS任務(wù)節(jié)拍為單位)。


// Write data to UART, end with a break signal.uart_write_bytes_with_break(uart_num, 'test breakn',strlen('test breakn'), 100);

將數(shù)據(jù)寫入Tx FIFO緩沖區(qū)的另一個功能是uart_tx_chars()。不像uart_write_bytes(),此功能在可用空間之前不會阻塞。相反,它將寫入可立即放入硬件Tx FIFO中的所有數(shù)據(jù),然后返回已寫入的字節(jié)數(shù)。


有一個“陪伴”功能uart_wait_tx_done(),可監(jiān)視Tx FIFO緩沖區(qū)的狀態(tài)并在其為空時返回。


// Wait for packet to be sentconst int uart_num = UART_NUM_2;ESP_ERROR_CHECK(uart_wait_tx_done(uart_num, 100)); // wait timeout is 100 RTOS ticks (TickType_t)

3.4.2 接收

UART接收到數(shù)據(jù)并將其保存在Rx FIFO緩沖區(qū)后,需要使用函數(shù)進行讀出uart_read_bytes()。,這個函數(shù)會阻塞待在那里,直到讀滿需要的字節(jié),或是超時。


在讀取數(shù)據(jù)之前,您可以調(diào)用來檢查Rx FIFO緩沖區(qū)中可用的字節(jié)數(shù)uart_get_buffered_data_len(),然后再讀取相應(yīng)的內(nèi)容,這樣就不會造成不必要的阻塞。下面給出了使用這些功能的示例。


// Read data from UART.const int uart_num = UART_NUM_2;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);

如果不再需要Rx FIFO緩沖區(qū)中的數(shù)據(jù),則可以通過調(diào)用清除緩沖區(qū)uart_flush()。


四、串口回環(huán)輸出

這里我將GPIO4、GPIO5改成了GPIO23、GPIO18


#include #include 'freertos/FreeRTOS.h'#include 'freertos/task.h'#include 'driver/uart.h'#include 'driver/gpio.h'/**

 * This is an example which echos any data it receives on UART1 back to the sender,

 * with hardware flow control turned off. It does not use UART driver event queue.

 *

 * - Port: UART1

 * - Receive (Rx) buffer: on

 * - Transmit (Tx) buffer: off

 * - Flow control: off

 * - Event queue: off

 * - Pin assignment: see defines below

 */#define ECHO_TEST_TXD  (GPIO_NUM_23)#define ECHO_TEST_RXD  (GPIO_NUM_18)#define ECHO_TEST_RTS  (UART_PIN_NO_CHANGE)#define ECHO_TEST_CTS  (UART_PIN_NO_CHANGE)#define BUF_SIZE (1024)static void echo_task(void *arg){

    /* 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,

    };

    uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0);

    uart_param_config(UART_NUM_1, &uart_config);

    uart_set_pin(UART_NUM_1, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS);


    // Configure a temporary buffer for the incoming data

    uint8_t *data = (uint8_t *) malloc(BUF_SIZE);


    while (1) {

        // Read data from the UART

        int len = uart_read_bytes(UART_NUM_1, data, BUF_SIZE, 20 / portTICK_RATE_MS);

        // Write data back to the UART

        uart_write_bytes(UART_NUM_1, (const char *) data, len);

    }}void app_main(void){

    xTaskCreate(echo_task, 'uart_echo_task', 1024, NULL, 10, NULL);}

五、串口隊列接收

/*********************************************************************

 * INCLUDES

 */#include #include #include #include 'freertos/FreeRTOS.h'#include 'freertos/task.h'#include 'freertos/queue.h'#include 'driver/uart.h'#include 'esp_log.h'#define BUF_SIZE (1024)#define UART_MAX_NUM_RX_BYTES (1024)static void uartEventTask(void *pvParameters);/*********************************************************************

 * LOCAL VARIABLES

 */static QueueHandle_t s_uart0Queue;static const char *TAG = 'board_uart';/*********************************************************************

 * PUBLIC FUNCTIONS

 *//**

 @brief 串口驅(qū)動初始化

 @param 無

 @return 無

*/void UART_Init(void){

    // 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    };


    uart_param_config(UART_NUM_0, &uart_config);                                            // 配置串口0參數(shù)

    uart_set_pin(UART_NUM_0, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);// 配置串口0引腳

    // Install UART driver, and get the queue.

    uart_driver_install(UART_NUM_0, BUF_SIZE * 2, BUF_SIZE * 2, 100, &s_uart0Queue, 0);     // 安裝UART驅(qū)動程序


    // Create a task to handler UART event from ISR

    xTaskCreate(uartEventTask, 'uartEventTask', 2048, NULL, 12, NULL);  }/*********************************************************************

 * LOCAL FUNCTIONS

 */static void uartEventTask(void *pvParameters){

    uart_event_t event;

    uint8_t *pTempBuf = (uint8_t *)malloc(UART_MAX_NUM_RX_BYTES);


    for(;;)

    {

        // Waiting for UART event.

        if(xQueueReceive(s_uart0Queue, (void *)&event, (portTickType)portMAX_DELAY))

        {

            bzero(pTempBuf, UART_MAX_NUM_RX_BYTES);


            switch(event.type)

            {

                // Event of UART receving data

                // We'd better handler data event fast, there would be much more data events than

                // other types of events. If we take too much time on data event, the queue might be full.

                case UART_DATA:

                    // ESP_LOGI(TAG, '[UART DATA]: %d', event.size);

                    uart_read_bytes(UART_NUM_0, pTempBuf, event.size, portMAX_DELAY);

                    uart_write_bytes(UART_NUM_0, (const char *)pTempBuf, event.size);

                    break;


                // Event of HW FIFO overflow detected

                case UART_FIFO_OVF:

                    ESP_LOGI(TAG, 'hw fifo overflow');

                    // If fifo overflow happened, you should consider adding flow control for your application.

[1] [2]
關(guān)鍵字:ESP32  UART  串口使用 引用地址:ESP32學習筆記(4)——UART串口使用

上一篇:ESP32學習筆記(5)——WiFi接口使用(STA和AP模式)
下一篇:ESP32學習筆記(3)——高分辨率定時器接口使用

推薦閱讀最新更新時間:2025-06-30 17:45

stm32f407串口通信使用流程
初始化 1.定義初始化變量 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; 2.使能時鐘 GPIO開啟AHB1時鐘 USART1開啟APB2時鐘 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1時鐘 3.配置GPIO端口為引腳復(fù)用USA
[單片機]
實時時鐘的演示:毫秒級計時輸出;串口輸出;中斷的使用
/************************************************************************************** 龍丘MC9S12XS128 多功能開發(fā)板 Designed by Chiu Sir E-mail:chiusir@163.com 軟件版本:V1.1 最后更新:2009年2月28日 相關(guān)信息參考下列地址: 博客: http://longqiu.21ic.org 淘寶店: http://shop36265907.taobao.com ------------------------------------ Code Warrior 4.7 Target :
[單片機]
STM32—無需中斷來實現(xiàn)使用DMA接收串口數(shù)據(jù)
本節(jié)目標: 通過DMA,無需中斷,接收不定時長的串口數(shù)據(jù) 描述: 當在串口多數(shù)據(jù)傳輸下,CPU會產(chǎn)生多次中斷來接收串口數(shù)據(jù),這樣會大大地降低CPU效率,同時又需要CPU去做其它更重要的事情,我們應(yīng)該如何來優(yōu)化? 比如四軸飛行器,當在不停地獲取姿態(tài)控制方向時,又要去接收串口數(shù)據(jù). 答:使用DMA,無需CPU中斷便能實現(xiàn)接收串口數(shù)據(jù) 1.DMA介紹 DMA,全稱為: Direct Memory Access,即直接存儲器訪問, DMA 傳輸方式無需 CPU 直接控制傳輸,通過硬件為 RAM 與 I/O 設(shè)備開辟一條直接傳送數(shù)據(jù)的通路,能使 CPU 的效率大為提高。 2在main()中調(diào)用串口配置函數(shù),初始化串口后,然后使能UA
[單片機]
STM32—無需中斷來實現(xiàn)<font color='red'>使用</font>DMA接收<font color='red'>串口</font>數(shù)據(jù)
基于ESP32制作安卓應(yīng)用藍牙控制的家庭自動化系統(tǒng)
使用基于 ESP32 的定制設(shè)計 PCB 的 Android 應(yīng)用和藍牙控制的家用設(shè)備,在本文中,我們將制作安卓應(yīng)用藍牙控制的家庭自動化系統(tǒng)。 現(xiàn)在我們可以使用 ESP32 的藍牙功能通過智能手機控制我們的家電。除此之外,我們還可以通過我們通常使用的手動開關(guān)按鈕來控制設(shè)備。 為了制作這個家庭自動化系統(tǒng),我將使用我的 2 節(jié)點 SMT 家庭自動化 PCB 和定制設(shè)計的 android 應(yīng)用程序。 這個項目最好的部分是我們不需要任何互聯(lián)網(wǎng)連接或任何本地服務(wù)器來將安卓應(yīng)用程序連接到 ESP32。 大多數(shù)人沒有WIFI連接,所以這個家庭自動化系統(tǒng)適合他們。 此處 App 將通過藍牙直接與 ESP32 通信, 使用藍牙是為本地范圍制
[嵌入式]
基于<font color='red'>ESP32</font>制作安卓應(yīng)用藍牙控制的家庭自動化系統(tǒng)
[nrf52832][nrf52840][nrf52810][nrf52820][bsp_uart] UART配置和使用
UART —通用異步接收/發(fā)送器 功能描述 這里列出了UART的主要特性。 UART實現(xiàn)了對以下特性的支持: 全雙工操作 自動流量控制 第9位數(shù)據(jù)位校驗和生成 如圖160所示:第531頁的UART配置,UART直接使用TXD和RXD寄存器來發(fā)送和接收數(shù)據(jù)。 UART使用一個停止位。 引腳的配置 不同的信號RXD, CTS (Clear To Send, active low), RTS (Request To Send, active low)和TXD與UART相關(guān)聯(lián),分別根據(jù)PSELRXD, PSELCTS, PSELRTS和PSELTXD寄存器中指定的配置映射到物理引腳。 如果在這些寄存器中指定了0xFFFFFFFF值
[單片機]
[nrf52832][nrf52840][nrf52810][nrf52820][bsp_<font color='red'>uart</font>] <font color='red'>UART</font>配置和<font color='red'>使用</font>
51內(nèi)核UART串行總線環(huán)形緩沖區(qū)驅(qū)動實現(xiàn)
1:驅(qū)動簡述; 驅(qū)動實現(xiàn)串口中斷接收和發(fā)送數(shù)據(jù),緩沖區(qū)使用環(huán)形緩沖區(qū)。發(fā)送:手動置RI中斷標志位為1,發(fā)生中斷,在中斷發(fā)送函數(shù)中將需要發(fā)送的數(shù)據(jù)一一發(fā)送出去,具體見示例;接收:在中斷接收函數(shù)中保存接收到滿足協(xié)議的數(shù)據(jù),后置接收成功標志位,最終在main函數(shù)while循環(huán)中輪詢接收成功標志位是否置1,如果置1,處理接收到的數(shù)據(jù)。 2:代碼示例; 以下代碼模仿modbus協(xié)議,貼串口發(fā)送函數(shù)和中斷處理函數(shù),適用于51系列單片機,具體的串口協(xié)議可參考modbus協(xié)議或者自己根據(jù)需求定義。 uart.h文件 #define COM_TX1_Lenth 20 #define COM_RX1_Lenth 20 typ
[單片機]
LPC2214 SPI及UART初始化程序
//SPI1口發(fā)數(shù) void spi1senddata(uint8 data) { IO0CLR = le58_ctrl_cs; // 片選 S1PDR = data; while(0==(S1PSR&0x80)); // 等待SPIF置位,即等待數(shù)據(jù)發(fā)送完畢 IO0SET = le58_ctrl_cs; } /**************************************************************************** * 名稱:UART0_Init() * 功能:串口工作參數(shù)設(shè)置。 * 入口參數(shù):無 * 出口參數(shù):無 ******************
[單片機]
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved