0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

[esp32教程] 5、UART使用

板凳說 ? 來源:板凳說 ? 作者:板凳說 ? 2023-06-13 09:04 ? 次閱讀

0、前期準(zhǔn)備

1、參考首篇文章搭建好esp32環(huán)境

2、準(zhǔn)備好一塊esp32開發(fā)開發(fā)板(本作者使用了esp32c3作為開發(fā)平臺(tái))

1、知識(shí)儲(chǔ)備

1.1 概述

? UART稱為通用異步收發(fā)器,可以進(jìn)行全雙工/半雙工數(shù)據(jù)通訊數(shù)據(jù)通訊,通訊距離取決于上拉驅(qū)動(dòng)能力、波特率,一般只在電路板上使用,如果需要長距離通訊可以外接RS232(最長通訊距離15M)、RS485電平轉(zhuǎn)換芯片,但是要注意如果外接的是RS485電平芯片,只能進(jìn)行半雙工通訊,在理想情況下使用9600波特率,其通訊距離可達(dá)1200M。

1.2 功能架構(gòu)

? 樂鑫EPS32C3帶有2個(gè)UART控制器,不僅可以用來進(jìn)行數(shù)據(jù)通訊,還能來用驅(qū)動(dòng)紅外發(fā)射管。(目前本文只用來作uart通訊)

1.3 uart配置流程介紹

LEDC的配置流程可分為以下3步

1、uart配置:設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗(yàn)位和流控

2、引腳綁定:設(shè)置UART使用哪幾個(gè)引腳

3、 注冊u(píng)art中斷驅(qū)動(dòng)(可選--建議進(jìn)行該配置,本文給出例子就使用該方式)

1、uart配置

uart的配置主要是給 uart_config_t 結(jié)構(gòu)體賦值,然后通過uart_param_config函數(shù)進(jìn)行uart設(shè)置

以下對uart_config_t 結(jié)構(gòu)體進(jìn)行說明

typedef struct {
    int baud_rate;                      //波特率
    uart_word_length_t data_bits;       //數(shù)據(jù)位
    uart_parity_t parity;               //奇偶校驗(yàn)位
    uart_stop_bits_t stop_bits;         //停止位
    uart_hw_flowcontrol_t flow_ctrl;    //硬件流控
    uint8_t rx_flow_ctrl_thresh;        //硬件流控的RTS閾值
    union {
        uart_sclk_t source_clk;         //時(shí)鐘
        bool use_ref_tick  __attribute__((deprecated)); 
    };
} uart_config_t;

例子:

// uart1配置
// 115200 8 1 無奇偶校驗(yàn)位 無流控
uart_config_t uart_conf = {
    .baud_rate = 115200,
    .data_bits = UART_DATA_8_BITS,
    .stop_bits = UART_STOP_BITS_1,
    .parity = UART_PARITY_DISABLE,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_APB,
};

uart_param_config(UART_NUM_1, &uart_conf);
2、引腳綁定

設(shè)置UART使用哪幾個(gè)引腳

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);
// 參數(shù) :uart_num:串口編號(hào) 可查看uart.h,進(jìn)行選擇
//     tx_io_num:發(fā)送引腳編號(hào),不需要可填:UART_PIN_NO_CHANGE
//     rx_io_num: 接收引腳編號(hào),不需要可填:UART_PIN_NO_CHANGE
//     rts_io_num:rts引腳編號(hào),不需要可填:UART_PIN_NO_CHANGE
//     cts_io_num:cts引腳編號(hào),不需要可填:UART_PIN_NO_CHANGE

例子:

// 引腳綁定
uart_set_pin(UART_NUM_1, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
3、 注冊u(píng)art中斷驅(qū)動(dòng)(配置可選)

通過注冊u(píng)art中斷,可以不用開一個(gè)任務(wù)實(shí)時(shí)的去讀取串口,判斷串口有沒有數(shù)據(jù)發(fā)送過來,提高系統(tǒng)實(shí)時(shí)性。

中斷驅(qū)動(dòng)uart_driver_install函數(shù)參數(shù)說明如下:

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);
// 參數(shù) :uart_num:串口編號(hào) 可查看uart.h,進(jìn)行選擇
//     rx_buffer_size:uart接收數(shù)組大小
//     tx_buffer_size: uart發(fā)送數(shù)組大小
//     queue_size: uart接收消息隊(duì)列大小,和新建的消息隊(duì)列大小一致
//     uart_queue:uart接收消息隊(duì)列句柄
//     intr_alloc_flags:中斷標(biāo)志位

例子:

QueueHandle_t uart_queue = NULL;    
uart_queue = xQueueCreate(8, 512);
uart_driver_install(UART_PORT, RX_BUFF_SIZE, RX_BUFF_SIZE, 8, &uart_queue, 0);
4、 其他函數(shù)

本文只介紹發(fā)送和接收兩個(gè)函數(shù),更多函數(shù)可參考樂鑫官網(wǎng)

int uart_read_bytes(uart_port_t uart_num, void *buf, uint32_t length, TickType_t ticks_to_wait);
//參數(shù) : uart_num:串口編號(hào) 可查看uart.h,進(jìn)行選擇
//       buf:接收數(shù)組名
//       length:接收到的數(shù)據(jù)長度
//       ticks_to_wait:讀取等待的RTOS 滴答個(gè)數(shù)
//返回 : -1:表示錯(cuò)誤
//      其他:表示從uart的接收fifo讀取到的數(shù)據(jù)

int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size);
//參數(shù) : uart_num:串口編號(hào) 可查看uart.h,進(jìn)行選擇
//       src:發(fā)送數(shù)組名
//       size:發(fā)送的數(shù)據(jù)長度
//返回 : -1:表示錯(cuò)誤
//      其他:表示uart發(fā)送給發(fā)送fifo的數(shù)據(jù)

2、新建工程

idf.py create-project project_uart # 新建工程
cd project_uart
idf.py set-target esp32c3 # 設(shè)置工程使用的芯片

2、查看原理圖確定uart引腳

uart.png

3、編寫程序

#include < freertos/FreeRTOS.h >
#include < freertos/queue.h >
#include < freertos/task.h >

#include < driver/gpio.h >
#include < driver/uart.h >
#include < esp_log.h >

#include < string.h >

#define LOG_EVENT_TAG "uart"

QueueHandle_t uart_queue = NULL;

#define RX_BUFF_SIZE 1024

#define UART_PORT UART_NUM_2
#define RX_PIN GPIO_NUM_1
#define TX_PIN GPIO_NUM_0

uint8_t uart_buff[RX_BUFF_SIZE];

void UartEventHandle(void* param);

void init_uart(void) {
    uart_config_t uart_conf = {
        .baud_rate = 115200,
        .data_bits = UART_DATA_8_BITS,
        .stop_bits = UART_STOP_BITS_1,
        .parity = UART_PARITY_DISABLE,
        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
        .source_clk = UART_SCLK_APB,
    };

    uart_param_config(UART_PORT, &uart_conf);
    uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

    uart_queue = xQueueCreate(8, 512);
    uart_driver_install(UART_PORT, RX_BUFF_SIZE, RX_BUFF_SIZE, 8, &uart_queue, 0);

    xTaskCreate(UartEventHandle, "uart_event_hanle", 1024, NULL, 5, NULL);
}

void UartEventHandle(void* param) {
    uart_event_t event;
    memset(&uart_data, 0, sizeof(UartData));
    uart_data.rx_status = pdFALSE;
    while (pdTRUE) {
        if (xQueueReceive(uart_queue, (void*)&event, portMAX_DELAY)) {
            switch (event.type) {
                case UART_DATA:
                    memset(&uart_data, 0, sizeof(UartData));
                    uart_data.rx_status = pdFALSE;
                    if (event.size <= sizeof(uart_data.buff)) {
                        uart_data.rx_status = pdTRUE;
                        uart_data.rx_uart_len = event.size;
                        uart_read_bytes(UART_PORT, uart_buff, event.size, portMAX_DELAY);
                        ESP_LOGI(LOG_EVENT_TAG, "uart_buff: %s", uart_buff);
                    }

                    break;
                case UART_FIFO_OVF:
                case UART_BUFFER_FULL:
                    uart_flush_input(UART_PORT);
                    xQueueReset(uart_queue);
                    break;
                default:
                    ESP_LOGI(LOG_EVENT_TAG, "uart event type: %d", event.type);
                    break;
            }
        }
    }
}

void app_main(void) {
    init_uart();

    while (1) {
        vTaskDelay(1000 / portTICK_RATE_MS);
    }
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    16028

    瀏覽量

    176643
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1214

    瀏覽量

    100997
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4834

    瀏覽量

    96835
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61851
  • ESP32
    +關(guān)注

    關(guān)注

    17

    文章

    943

    瀏覽量

    16902
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ESP32UART串口通信概覽

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)文章目錄ESP32ESP-IDF 教學(xué)(九)—— 串口通信(
    發(fā)表于 12-09 07:52

    如何通過uartesp32-wroom-32d(uart0) 發(fā)送數(shù)據(jù)到esp32-s3(uart1) ?

    我有一個(gè)關(guān)于 uart 通信的問題。我有兩個(gè) esp32,它們是 esp32-devkit-c_v4(esp32-wroom-32d) 和 ESP3
    發(fā)表于 02-28 08:32

    ESP32模組的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型開發(fā)板,集WIFI+藍(lán)牙方案于一體,板上模組絕大部分管腳均已引出,開發(fā)人員可根據(jù)實(shí)際需求,輕松通過跳線連接多種外圍器件,或?qū)㈤_發(fā)板直接
    發(fā)表于 11-04 14:54 ?3874次閱讀

    ESP32開發(fā)套件 ESP32-DevKitC

    今天推出的一款套件是來自全球創(chuàng)客屆大名鼎鼎的樂鑫科技官方提供的經(jīng)典ESP32開發(fā)套件 -?ESP32-DevKitC。 它基于樂鑫ESP32控制器(32-bit MCU 2.4 GHz Wi-Fi
    的頭像 發(fā)表于 01-06 16:55 ?8241次閱讀

    ESP32-WROOM-32E和ESP32-WROOM-32UE模組的區(qū)別

    ESP32-WROOM系列模組基于 ESP32-D0WD 雙核芯片設(shè)計(jì),適用于基于 Wi-Fi 和藍(lán)牙連接的應(yīng)用場景,具備強(qiáng)大的雙核性能。而其中的ESP32
    發(fā)表于 06-01 16:41 ?1.8w次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模組的區(qū)別

    esp32和arduino的區(qū)別,esp32能否替代arduino

    很多創(chuàng)客愛好者甚至有些技術(shù)工程師在理解esp32和arduino的時(shí)候總是問一句這兩塊板子哪個(gè)更好用?他們可能潛意識(shí)中就覺得arduino和esp32是競品的關(guān)系,但實(shí)際是這樣嗎?今天我們就深入
    發(fā)表于 06-24 17:11 ?2.6w次閱讀

    ESP32 開發(fā)之旅② Arduino For ESP32說明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫3.與ESP8266庫類比3.1 WiFi —— ESP
    發(fā)表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開發(fā)之旅② Arduino For <b class='flag-5'>ESP32</b>說明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在說明如何使用標(biāo)準(zhǔn)的 ESP32-WROOM-32D 開發(fā)板進(jìn)行 SDIO 的通信。本文檔適用于所有需要與 ESP32 SDIO slave 通信的方案
    發(fā)表于 11-23 17:51 ?233次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)文章目錄ESP32ESP-IDF 教學(xué)(九)—— 串口通信(
    發(fā)表于 11-26 13:21 ?43次下載
    <b class='flag-5'>ESP32</b> 之 <b class='flag-5'>ESP</b>-IDF 教學(xué)(九)—— 串口通信(<b class='flag-5'>UART</b>)

    ESP32系列芯片的規(guī)格

    ESP32是一款2.4GHz Wi-Fi和藍(lán)牙組合芯片,采用TSMC超低功耗40nm設(shè)計(jì)技術(shù)它旨在實(shí)現(xiàn)最佳功率和射頻性能,顯示出魯棒性、多功能性和靈活性在各種應(yīng)用和電源場景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    發(fā)表于 04-25 16:21 ?7次下載

    ESP32上的自定義UART協(xié)議開源

    電子發(fā)燒友網(wǎng)站提供《ESP32上的自定義UART協(xié)議開源.zip》資料免費(fèi)下載
    發(fā)表于 02-13 16:38 ?4次下載
    <b class='flag-5'>ESP32</b>上的自定義<b class='flag-5'>UART</b>協(xié)議開源

    ESP32 PWM驅(qū)動(dòng)電機(jī)

    18 PWM控制B電機(jī) 4 A1 15 A2 17 B1 5 B2PWM控制電機(jī)方法參考—— PWM如何控制直流電機(jī) 驅(qū)動(dòng)芯片TB6612FNG ESP32使用PWM frommachineimportP
    發(fā)表于 03-20 11:37 ?3次下載
    <b class='flag-5'>ESP32</b> PWM驅(qū)動(dòng)電機(jī)

    ESP32ESP32通過Internet進(jìn)行通信

    電子發(fā)燒友網(wǎng)站提供《ESP32ESP32通過Internet進(jìn)行通信.zip》資料免費(fèi)下載
    發(fā)表于 06-15 09:58 ?4次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過Internet進(jìn)行通信

    ESP32學(xué)習(xí)筆記:串口

    ESP32 芯片有3 個(gè)UART 接口,UART0,UART1,UART2,支持異步通信和 IrDA,通信速度最高可達(dá)
    的頭像 發(fā)表于 07-13 17:09 ?5961次閱讀
    <b class='flag-5'>ESP32</b>學(xué)習(xí)筆記:串口

    esp32s3使用多串口

    ESP32-S3 有三個(gè) UART(通用異步收發(fā)器)控制器,即 UART0、UART1、UART2,支持異步通信(RS232 和 RS48
    的頭像 發(fā)表于 11-06 11:29 ?3832次閱讀
    <b class='flag-5'>esp32</b>s3使用多串口