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

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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ā)平臺)

1、知識儲備

1.1 概述

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

1.2 功能架構(gòu)

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

1.3 uart配置流程介紹

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

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

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

3、 注冊uart中斷驅(qū)動(可選--建議進(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;               //奇偶校驗位
    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、引腳綁定

設(shè)置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)// 參數(shù) :uart_num:串口編號 可查看uart.h,進(jìn)行選擇
//     tx_io_num:發(fā)送引腳編號,不需要可填: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中斷驅(qū)動(配置可選)

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

中斷驅(qū)動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:串口編號 可查看uart.h,進(jìn)行選擇
//     rx_buffer_size:uart接收數(shù)組大小
//     tx_buffer_size: uart發(fā)送數(shù)組大小
//     queue_size: uart接收消息隊列大小,和新建的消息隊列大小一致
//     uart_queue:uart接收消息隊列句柄
//     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ā)送和接收兩個函數(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:串口編號 可查看uart.h,進(jìn)行選擇
//       buf:接收數(shù)組名
//       length:接收到的數(shù)據(jù)長度
//       ticks_to_wait:讀取等待的RTOS 滴答個數(shù)
//返回 : -1:表示錯誤
//      其他:表示從uart的接收fifo讀取到的數(shù)據(jù)

int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size);
//參數(shù) : uart_num:串口編號 可查看uart.h,進(jìn)行選擇
//       src:發(fā)送數(shù)組名
//       size:發(fā)送的數(shù)據(jù)長度
//返回 : -1:表示錯誤
//      其他:表示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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    16832

    瀏覽量

    182195
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1250

    瀏覽量

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

    關(guān)注

    25

    文章

    5382

    瀏覽量

    100726
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    485

    瀏覽量

    63448
  • ESP32
    +關(guān)注

    關(guān)注

    20

    文章

    999

    瀏覽量

    18570
收藏 人收藏

    評論

    相關(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) ?

    我有一個關(guān)于 uart 通信的問題。我有兩個 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ù)實際需求,輕松通過跳線連接多種外圍器件,或?qū)㈤_發(fā)板直接
    發(fā)表于 11-04 14:54 ?4326次閱讀

    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 ?8807次閱讀

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

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

    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 ?235次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

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

    ESP32ESP-IDF 教學(xué)(九)—— 串口通信(UART)文章目錄ESP32ESP-IDF 教學(xué)(九)—— 串口通信(
    發(fā)表于 11-26 13:21 ?45次下載
    <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è)計技術(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ā)表于 02-13 16:38 ?4次下載
    <b class='flag-5'>ESP32</b>上的自定義<b class='flag-5'>UART</b>協(xié)議開源

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

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

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

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

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

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

    esp32s3使用多串口

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

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本質(zhì)上是讓 ESP32 設(shè)備與豆包的 API 進(jìn)行通信,以獲取相關(guān)服務(wù)
    的頭像 發(fā)表于 02-05 13:40 ?1322次閱讀
    <b class='flag-5'>esp32</b>如何接入豆包
    主站蜘蛛池模板: 手机在线观看一级午夜片 | 欧美性色视频 | 日日爱网站 | 在线视频资源 | 欧美7777kkkk免费看258 | 美女好紧好大好爽12p | 欧美一区二区三区在线观看免费 | 久久亚洲国产欧洲精品一 | 国产一级特黄在线播放 | 国产欧美日韩电影 | 国产乱辈通伦影片在线播放亚洲 | 特级中国aaa毛片 | 人人添人人澡人人澡人人人爽 | 高清色 | 成人国产激情福利久久精品 | 优优色综合| 国产精品伦视频观看免费 | 91在线免费看 | 国产三级日产三级韩国三级 | 手机免费在线视频 | 成人午夜影院在线观看 | 啪啪.com| 欧美黄三级在线观看 | 99久久精品国产自免费 | 欧美大狠狠大臿蕉香蕉大视频 | 免费看真人a一级毛片 | 国产亚洲3p一区二区三区 | 黄篇网站在线观看 | 日本免费人成在线网站 | 午夜性爽视频男人的天堂在线 | 女人的天堂网站 | 中日韩精品视频在线观看 | 手机看片福利 | 国产手机视频在线 | 免费观看做网站爱 | 天堂8中文在线bt | 精品亚洲国产国拍 | 3344成年在线视频免费播放男男 | 人人做人人爽人人爱秋霞影视 | 香港经典a毛片免费观看爽爽影院 | 免费午夜不卡毛片 |