娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

ESP32學(xué)習(xí)筆記(4)——UART串口使用

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

一、概述

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

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

每個(gè)UART控制器都是獨(dú)立配置的,參數(shù)包括波特率、數(shù)據(jù)比特長度、位序、停止位數(shù)、奇偶校驗(yàn)位等。所有控制器都與不同廠商的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ā)板串口一默認(rèn)的是GPIO9和GPIO10,現(xiàn)在將TX、RX映射到GPIO4和GPIO5上。

三、編程流程

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

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

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


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ā)板串口一默認(rèn)的是GPIO9和GPIO10,現(xiàn)在將TX、RX映射到GPIO4和GPIO5上。


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


如果要為特定信號保留當(dāng)前分配的管腳號,請傳遞宏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ū)的大小


事件隊(duì)列句柄和大小


分配中斷的標(biāo)志


該功能將為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 運(yùn)行UART通信

串行通信由每個(gè)UART控制器的有限狀態(tài)機(jī)(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ā)送

準(zhǔn)備好要傳輸?shù)臄?shù)據(jù)后,調(diào)用該函數(shù)uart_write_bytes()并將數(shù)據(jù)緩沖區(qū)的地址和數(shù)據(jù)長度傳遞給該函數(shù)。該函數(shù)將數(shù)據(jù)復(fù)制到Tx環(huán)形緩沖區(qū)(立即或在有足夠空間可用之后),然后退出。當(dāng)Tx FIFO緩沖區(qū)中有可用空間時(shí),中斷服務(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é)束時(shí)添加了一個(gè)串行中斷信號。意味著它會在發(fā)送完數(shù)據(jù)之后,設(shè)置TX低電平一段時(shí)間(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ū)的另一個(gè)功能是uart_tx_chars()。不像uart_write_bytes(),此功能在可用空間之前不會阻塞。相反,它將寫入可立即放入硬件Tx FIFO中的所有數(shù)據(jù),然后返回已寫入的字節(jié)數(shù)。


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


// 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ù)進(jìn)行讀出uart_read_bytes()。,這個(gè)函數(shù)會阻塞待在那里,直到讀滿需要的字節(jié),或是超時(shí)。


在讀取數(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);}

五、串口隊(duì)列接收

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

 * 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學(xué)習(xí)筆記(4)——UART串口使用

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

推薦閱讀最新更新時(shí)間:2025-05-29 11:06

STM32G0開發(fā)筆記:串口中斷的使用
使用Platformio平臺的libopencm3開發(fā)框架來開發(fā)STM32G0,以下為串口中斷的使用。 1 新建項(xiàng)目 建立uart項(xiàng)目 在PIO的Home頁面新建項(xiàng)目,項(xiàng)目名稱uart,選擇開發(fā)板為上一次建立的自定義開發(fā)板型號 MonkeyPi_STM32_G070RB,開發(fā)框架選擇libopencm3; 項(xiàng)目建立完成后在src目錄下新建main.c主程序文件; 修改下載和調(diào)試方式,這里開發(fā)板使用的是DAPLink仿真器,因此修改platformio.ini文件如下: 1upload_protocol = cmsis-dap 2debug_tool = cmsis-dap 2 編寫程序 時(shí)鐘設(shè)置 1//system cl
[單片機(jī)]
STM32:重定向 prinft 和 getchar 函數(shù),但是使用過程串口出現(xiàn)問題
在STM32學(xué)習(xí)中,我們肯定會學(xué)到串口的使用。其中關(guān)于串口數(shù)據(jù)的接收和發(fā)送,我們其實(shí)可以用 printf() 函數(shù)和 getchar() 函數(shù)來簡化傳輸。我們只需要做一些簡單的前期工作即可。 在 C 語言標(biāo)準(zhǔn)庫中,fputc 函數(shù)是 printf 函數(shù)內(nèi)部的一個(gè)函數(shù),功能是將字符 ch 寫入到文件指針 f 所指向文件的當(dāng)前寫指針位置,簡單理解就是把字符寫入到特定文件中。我們使用 USART 函數(shù)重新修改 fputc 函數(shù)內(nèi)容,達(dá)到類似“寫入”的功能。 fgetc 函數(shù)與 fputc 函數(shù)非常相似,實(shí)現(xiàn)字符讀取功能。在使用 scanf 函數(shù)時(shí)需要注意字符輸入格式。 還有一點(diǎn)需要注意的,使用 fput 和 fgetc 函數(shù)
[單片機(jī)]
STM32:重定向 prinft 和 getchar 函數(shù),但是<font color='red'>使用</font>過程<font color='red'>串口</font>出現(xiàn)問題
STM32F103C8T6使用普通IO口模擬串口收發(fā)
導(dǎo): 由于項(xiàng)目系統(tǒng)功能版本升級,需要開發(fā)一個(gè)帶有串口收發(fā)的功能,但是硬件串口已經(jīng)全部使用,發(fā)現(xiàn)還剩余部分普通gpio口可以使用,故打算采用軟件模擬的方法實(shí)現(xiàn)該功能; 很久以前使用過51單片機(jī)來實(shí)現(xiàn)過類似功能,現(xiàn)在首次使用stm32來實(shí)現(xiàn)該功能;先借鑒一些網(wǎng)上的demo; 產(chǎn)品的代碼初始框架不是我自己搭建的,下回輪到我來搭,一定一定用操作系統(tǒng)來完成,要不然資源的配置,考慮太多,真的麻煩死了; 參考:https://blog.csdn.net/yunjie167/article/details/79808464 1.阻塞的通訊 阻塞式通訊 51單片機(jī),是沒有操作系統(tǒng)的,并且定時(shí)器也是非常的有限的;所以再模擬iic通訊,
[單片機(jī)]
STM32F103C8T6<font color='red'>使用</font>普通IO口模擬<font color='red'>串口</font>收發(fā)
stm32串口usart的使用
一、串口的定義 用來與外界交互數(shù)據(jù)。 二、usart的配置: 1、開啟時(shí)鐘。 stm32的usart1掛載在apb2上,USART2、usart3掛載在apb1上。 2、串口的基本配置。 void USART1_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_DeInit (USART1 ); USART_InitStructure .USART_BaudRate =9600; USART_InitStructure .USART_WordLength =USART_WordLength_8b ; USART_InitStructure .USA
[單片機(jī)]
niosII中串口RS232程序使用結(jié)構(gòu)體和聯(lián)合體結(jié)合的用法
這一節(jié),我們針對大家提出的有關(guān)定義寄存器結(jié)構(gòu)體的問題進(jìn)行解析。在NIOS II軟件開發(fā)過程中,如果使用我們提出的寄存器操作方式的話,首先需要定義一個(gè)寄存器結(jié)構(gòu)體,之所以這樣做是為了在軟件書寫過程中操作方便,更是為了增強(qiáng)程序的可讀性。我們就拿UART來舉例說明。 ????? 首先,我們看一下UART的寄存器說明,如下表所示 ????? 我們通過上表可以看到,UART包括6個(gè)寄存器(由于最后一個(gè)寄存器一般不用,所以建立的結(jié)構(gòu)體中沒有加入它),假設(shè)基地址為0x00的話,那么他們的地址分別為0x00,0x01,0x02,0x03,0x04,0x05。也就是說,各個(gè)寄存器之間是存在順序的。那么,在我們建立結(jié)構(gòu)體過程中也要注意他們的順序
[嵌入式]
基于ESP32的卡林巴琴制作教程
作為一個(gè)理工男,對音樂總有著迷之興趣。但是在這方面一直缺乏指導(dǎo),只在小學(xué)的時(shí)候上過幾節(jié)音樂,記得少許簡譜的概念。后來中學(xué)忙于文化課,大學(xué)選擇了電子專業(yè),與音樂就越來越遠(yuǎn)。筆者現(xiàn)在已經(jīng)參加工作了,小時(shí)候埋在心里的種子終究會發(fā)芽,工作閑暇利用自己專業(yè)相關(guān)的知識,設(shè)計(jì)了一款電子樂器,與諸君分享。 1 卡林巴琴簡介 卡林巴琴本是非洲的一種民族樂器,通過彈撥發(fā)出聲音。本設(shè)計(jì)模仿卡林巴琴的外觀,采用圖1 所示的鼠標(biāo)按鍵代替卡林巴琴的金屬彈片,藍(lán)牙連接手機(jī),在手機(jī)上發(fā)出聲音。 圖1 鼠標(biāo)按鍵 2 硬件設(shè)計(jì) 該設(shè)計(jì)采用ESP32 作為主控單元,ESP32 是一顆功能強(qiáng)大的物聯(lián)網(wǎng)芯片,可同時(shí)支持WiFi 和藍(lán)牙功能,20+ 可用GPIO
[嵌入式]
基于<font color='red'>ESP32</font>的卡林巴琴制作教程
AVR USART(UART)接收中斷程序
系統(tǒng)功能 使用AVR的USART進(jìn)行自發(fā)自收(將發(fā)送引腳RXD短接到接收引腳TXD),發(fā)出數(shù)據(jù):0,1,2。。。數(shù)據(jù),能接收到自己發(fā)出的數(shù)據(jù):0,1,2。。。使用LED作出簡單指示! 硬件設(shè)計(jì) AVR主控電路原理圖 LED控制電路原理圖 軟件設(shè)計(jì) 下面部分從TXT拷出,拷到網(wǎng)頁,代碼部分缺省了很多空格,比較凌亂,請諒解! //目標(biāo)系統(tǒng): 基于AVR單片機(jī) //應(yīng)用軟件: ICC AVR /*01010101010101010101010101010101010101010101010101010101010101010101 ------------------------------------
[單片機(jī)]
AVR USART(<font color='red'>UART</font>)接收中斷程序
STM32CubeMX系列教程 5.0版本環(huán)境開發(fā)——2.Uart串行通信功能
1.搭建一個(gè)基本工程: 具體請參考我的上一篇內(nèi)容搭建:https://www.cnblogs.com/Engineer-Lai/p/10072673.html 2.Uart協(xié)議簡要: 分為通俗描述和概念性描述 通俗描述: 1. 對于單片機(jī)入門的人來說,首先我們要明白 我們唯一可控的對象是IO口,IO有兩種狀態(tài) 0和1. 有兩種操作讀和寫(請務(wù)必確認(rèn)自己明白并可以操控,我們便可繼續(xù)) 2.在確認(rèn)第一點(diǎn)后,硬件協(xié)議存在的意義是什么:A對象 把N個(gè)數(shù)據(jù)遵照特定的規(guī)則傳給 B對象.(這里數(shù)據(jù)的單位是字節(jié),一個(gè)字節(jié)由8個(gè)位組成) 3.接下來就是如何傳數(shù)據(jù)的問題了,我們只有0和1可以表示。所以我們必須制定一套雙方都遵循的可行游戲規(guī)則。
[單片機(jī)]
STM32CubeMX系列教程 5.0版本環(huán)境開發(fā)——2.<font color='red'>Uart</font>串行通信功能
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(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
主站蜘蛛池模板: 岗巴县| 山东| 伊川县| 商城县| 兰西县| 吉木萨尔县| 衡东县| 浙江省| 唐河县| 梧州市| 新竹县| 康保县| 萝北县| 泰顺县| 台州市| 资溪县| 德化县| 诸城市| 巴林右旗| 济南市| 寿宁县| 平乡县| 兴隆县| 平山县| 西盟| 兰坪| 区。| 通州区| 聂拉木县| 梓潼县| 邓州市| 原平市| 凌源市| 深水埗区| 尼玛县| 老河口市| 顺昌县| 牟定县| 社旗县| 刚察县| 泸水县|