在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

[esp32教程] 5、UART使用

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

0、前期準備

1、參考首篇文章搭建好esp32環境

2、準備好一塊esp32開發開發板(本作者使用了esp32c3作為開發平臺)

1、知識儲備

1.1 概述

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

1.2 功能架構

? 樂鑫EPS32C3帶有2個UART控制器,不僅可以用來進行數據通訊,還能來用驅動紅外發射管。(目前本文只用來作uart通訊)

1.3 uart配置流程介紹

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

1、uart配置:設置波特率、數據位、停止位、奇偶校驗位和流控

2、引腳綁定:設置UART使用哪幾個引腳

3、 注冊uart中斷驅動(可選--建議進行該配置,本文給出例子就使用該方式)

1、uart配置

uart的配置主要是給 uart_config_t 結構體賦值,然后通過uart_param_config函數進行uart設置

以下對uart_config_t 結構體進行說明

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;    //硬件流控
    uint8_t rx_flow_ctrl_thresh;        //硬件流控的RTS閾值
    union {
        uart_sclk_t source_clk;         //時鐘
        bool use_ref_tick  __attribute__((deprecated)); 
    };
} uart_config_t;

例子:

// uart1配置
// 115200 8 1 無奇偶校驗位 無流控
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、引腳綁定

設置UART使用哪幾個引腳

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

例子:

// 引腳綁定
uart_set_pin(UART_NUM_1, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
3、 注冊uart中斷驅動(配置可選)

通過注冊uart中斷,可以不用開一個任務實時的去讀取串口,判斷串口有沒有數據發送過來,提高系統實時性。

中斷驅動uart_driver_install函數參數說明如下:

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

例子:

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、 其他函數

本文只介紹發送和接收兩個函數,更多函數可參考樂鑫官網

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

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

2、新建工程

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16361

    瀏覽量

    178071
  • uart
    +關注

    關注

    22

    文章

    1235

    瀏覽量

    101397
  • 開發板
    +關注

    關注

    25

    文章

    5050

    瀏覽量

    97484
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62181
  • ESP32
    +關注

    關注

    18

    文章

    971

    瀏覽量

    17276
收藏 人收藏

    評論

    相關推薦

    ESP32UART串口通信概覽

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

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

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

    ESP32模組的主要特性

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

    ESP32開發套件 ESP32-DevKitC

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

    ESP32-WROOM-32E和ESP32-WROOM-32UE模組的區別

    ESP32-WROOM系列模組基于 ESP32-D0WD 雙核芯片設計,適用于基于 Wi-Fi 和藍牙連接的應用場景,具備強大的雙核性能。而其中的ESP32
    發表于 06-01 16:41 ?1.9w次閱讀
    <b class='flag-5'>ESP32</b>-WROOM-32E和<b class='flag-5'>ESP32</b>-WROOM-32UE模組的區別

    esp32和arduino的區別,esp32能否替代arduino

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

    ESP32 開發之旅② Arduino For ESP32說明

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

    ESP32 SDIO 使用教程

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

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

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

    ESP32系列芯片的規格

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

    ESP32上的自定義UART協議開源

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

    ESP32 PWM驅動電機

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

    ESP32ESP32通過Internet進行通信

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

    ESP32學習筆記:串口

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

    esp32s3使用多串口

    ESP32-S3 有三個 UART(通用異步收發器)控制器,即 UART0、UART1、UART2,支持異步通信(RS232 和 RS48
    的頭像 發表于 11-06 11:29 ?4968次閱讀
    <b class='flag-5'>esp32</b>s3使用多串口
    主站蜘蛛池模板: 色老头久久久久| 欧色美| 久久香蕉国产线看观看精品yw| 2021日本三级理论影院| 91网站网站网站在线| 亚洲性色成人| 国模私拍视频在线观看| 黄字幕网| 亚洲高清色图| 国产三级日本三级日产三| 国产午夜视频| 一色桃子juy774在线播放| 好男人社区www的视频免费| 免费性bbbb台湾| 99久久免费精品国产免费高清| 免费人成网555www| 奇米影视欧美| 中文字幕一区二区三区乱码aⅴ| 久久全国免费久久青青小草| 欧美黄色录像视频| 在线毛片网| 国产高清美女一级a毛片| 亚洲乱强| 人人97| 久久精品系列| 无限国产资源| 亚洲爱爱图| 免费网站看黄| 激情六月天婷婷| www.天天射| 日韩免费精品视频| 日本又粗又长一进一出抽搐| 一级黄色免费毛片| 91正在播放| 欧美日本免费| 国产欧美一区二区三区观看| 好大好紧好爽好湿润视频 | 欧美一级特黄乱妇高清视频| 视色在线视频| 香焦视频在线观看黄| 午夜免费体验|