【玩轉ESP32】12、esp32串口使用

2022-01-07 物聯網思考

收錄於話題 #玩轉esp32 16個

點擊上方[物聯網思考],選擇置頂,第一時間查看物聯網分享!

ESP32晶片有三個UART控制器(UART0, UART1和UART2),其中UART0(GPIO3用於U0RXD,GPIO1用於U0TXD)用作下載、調試串口,引腳不可改變;

UART1和UART2的引腳是可以設置的。
UART1默認引腳是GPIO9用作U1RXD,GPIO10用作U1TXD,但是這兩個引腳也是用於外接flash的,因此在使用UART1的時候需要設置其他引腳;

UART2默認引腳是GPIO16用作U2RXD,GPIO17用作U2TXD。
2、API

在components/driver/include/driver/uart.h中可以查看api;

在examples/peripherals/uart中也可以參考官方的各種串口例程。

2.1、安裝uart驅動

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_queue屬於freertos裡面的隊列句柄,在這裡表示用於指示來自串口底層中斷的隊列消息。

2.2、uart參數配置

esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config);

2.3、接收閾值設置

esp_err_t uart_set_rx_full_threshold(uart_port_t uart_num, int threshold);

2.4、串口引腳設置

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

2.5、從接收緩衝區讀取數據

int uart_read_bytes(uart_port_t uart_num, uint8_t* buf, uint32_t length, TickType_t ticks_to_wait);

2.6、數據寫入發送緩衝區

int uart_write_bytes(uart_port_t uart_num, const char* src, size_t size);

3、代碼實現3.1、參數定義

#define EX_UART_NUM UART_NUM_1 //串口1

#define TXD_PIN (GPIO_NUM_17) //txd使用gpio17
#define RXD_PIN (GPIO_NUM_16) //rxd使用gpio16

#define BUF_SIZE (128) //緩衝區定義
static QueueHandle_t uart_queue; //隊列句柄
static uint8_t uartbuf[BUF_SIZE];

3.2、串口初始化

void uart_comm_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,
.source_clk = UART_SCLK_APB,
};
//Install UART driver, and get the queue.
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart_queue, 0);
uart_param_config(EX_UART_NUM, &uart_config);
uart_set_rx_full_threshold(EX_UART_NUM,126);

//Set UART pins (using UART0 default pins ie no changes.)
uart_set_pin(EX_UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

//Create a task to handler UART event from ISR
xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL); //創建串口任務
}

3.3、串口任務函數

static void uart_event_task(void *pvParameters)
{
uart_event_t event;
for(;;) {
//阻塞接收串口隊列,
//這個隊列在底層發送,用戶只需在應用層接收即可
if(xQueueReceive(uart_queue, (void * )&event, (portTickType)portMAX_DELAY)) {
switch(event.type) {//各種串口事件
case UART_DATA:
ESP_LOGI(TAG, "[UART DATA]: %d", event.size);
uart_read_bytes(EX_UART_NUM, uartbuf, event.size, portMAX_DELAY); //阻塞接收
ESP_LOGI(TAG, "[DATA EVT]:");
uart_write_bytes(EX_UART_NUM, uartbuf, event.size);//原樣發送
break;
//Event of HW FIFO overflow detected
case UART_FIFO_OVF: //硬體fifo溢出
ESP_LOGI(TAG, "hw fifo overflow");
// If fifo overflow happened, you should consider adding flow control for your application.
// The ISR has already reset the rx FIFO,
// As an example, we directly flush the rx buffer here in order to read more data.
uart_flush_input(EX_UART_NUM);
xQueueReset(uart_queue);
break;
//Event of UART ring buffer full
case UART_BUFFER_FULL: //環形緩衝區滿
ESP_LOGI(TAG, "ring buffer full");
// If buffer full happened, you should consider encreasing your buffer size
// As an example, we directly flush the rx buffer here in order to read more data.
uart_flush_input(EX_UART_NUM);
xQueueReset(uart_queue);
break;
//Event of UART RX break detected
case UART_BREAK:
ESP_LOGI(TAG, "uart rx break");
break;
//Event of UART parity check error
case UART_PARITY_ERR:
ESP_LOGI(TAG, "uart parity error");
break;
//Event of UART frame error
case UART_FRAME_ERR:
ESP_LOGI(TAG, "uart frame error");
break;
//UART_PATTERN_DET
case UART_PATTERN_DET:
break;
//Others
default:
ESP_LOGI(TAG, "uart event type: %d", event.type);
break;
}
}
}
vTaskDelete(NULL);
}

4、使用總結

初始化串口參數,(隊列指針、緩衝區、引腳等);

任務中阻塞等待串口隊列 。

————————END————————

推薦閱讀:

【玩轉ESP32】10、創建用戶分區表,數據讀寫存儲

【玩轉ESP32】9、ESP32 作為TCP客戶端連接伺服器(非阻塞)

【玩轉ESP32】8、ESP32 Guru Meditation Error報錯定位分析

相關焦點

  • 【玩轉ESP32】2、開發資料
    esp32 16個
  • 老宇哥帶你玩轉ESP32:01入門介紹
    1、ESP32介紹 ESP32 晶片是由樂鑫公司繼 ESP8266 晶片後推出的又一款集成 WiFi/BLE 功能的微控制器。性能比 ESP8266 更加強大,ESP32 晶片或模組具有下列特點:引腳圖,初期開發我們就用ESP32-DevKit開發板,便宜好用。
  • ESP32 coredump 分析
    上次寫了一個 ESP32 入門,我想有必要再寫這篇文章,這次主要是分析 coredump 的,這就像 Android 和 Linux 系統的死機分析,有意思,也有難度。我覺得 ESP32 還有一個好處是,對於初學者真的太方便了,買個 Linux 開發板可能要幾百塊,但是買一個 ESP32 模塊的話,也就 40 塊錢,而且也是跑 Freertos 系統的,還有還有就是非常方便攜帶,調試燒錄供電都可以用一個 usb 線搞定,說真的,我沒有收錢宣傳,是真的適合沒有錢又喜歡入門嵌入式的同學們,但是這個只是起點,嵌入式後期我覺得一定是要學習Linux 的。
  • 【玩轉ESP32】4、ESP32驅動DHT11
    收錄於話題 #玩轉esp32 16個
  • ESPnixie----基於ESP32的輝光鍾
    主控晶片直接使用了樂鑫官方的ESP32-WROOM-32UC模組。因為PCB板載天線增益較低,方向性也比較明顯,而且天線區域需要淨空,對器件布局來說會增加一些麻煩,所以特意選擇了這個需要外接天線的模組。淘寶上一個小巧的2.4G天線也就兩三塊錢,但是增益比板載天線要好得多了。
  • 基於ESP32與phyphox的物理DIS實驗開發(1)
    二、自製DIS實驗系統  自製DIS實驗系統組成部分與現有的差不多,主要使用了開源硬體(例如Arduino、ESP32等)來作為數據採集器,使用創客常用的傳感器模塊(例如超聲波測距儀、巡線傳感器等)作為傳感器,當然具體的數據採集與發送需要自己編程解決。
  • 啟明雲端分享|ESP32-S3如何實現tcp_client和tcp_server
    通過menuconfig配置伺服器的IP以及埠號配置完成後保存退出(伺服器的IP及埠)4.編譯、燒錄編譯:idf.py build燒錄:idf.py -p PORT [-b BAUD] flash註:只有一個串口時可以直接
  • ESP32晶片-LEDC外設(另附Arduino代碼)
    在文檔內,我們就看這裡就好在大量的說明舵機之前,不妨讓我們先來了解一些關於晶片本身的能力:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/ledc.html有個神奇的地方
  • 用Arduino玩轉掌控板(ESP32):B站粉絲計數器
    所以,有時間的話,我準備給大家分享一系列用 Arduino 代碼對掌控板(ESP32)編程的教程:用 Arduino 玩轉掌控版(ESP32)系列本期給大家帶來的是:B 粉計數器(B站粉絲計數器)。同樣的方法,我們去查一下播放數和獲贊數在哪裡可以查到。
  • ESP32 – GPIO 引腳參考大全
    所以,不要在你的項目中使用這些引腳:GPIO 6 (SCK/CLK)GPIO 7 (SDO/SD0)GPIO 8 (SDI/SD1)GPIO 9 (SHD/SD2)GPIO 10 (SWP/SD3)GPIO 11 (CSC/CMD)僅輸入引腳GPIO 34 到 39  是僅輸入引腳。這些引腳沒有內部上拉或下拉電阻。
  • 繼ESP8266之後,又一款將稱霸2017年的物聯網市場現象級產品——樂鑫ESP32(WiFi/藍牙雙模)評測
    核心模塊是基於樂鑫ESP32 WiFi/雙模藍牙 的單晶片SoC的模組,此模組經過大量的驗證測試,所以如果對這個ESP32這顆Soc晶片感興趣,建議先購買現成模塊開發;而擴展型功能底板主要是一個將核心模塊ESP-WROOM-32的IO引腳擴展出來,方便工程師開發調試,另外,底板也負責USB轉串口以及給WiFi模塊供電的職責。
  • 用 ESP32 開發板 DIY NES 掌機
    切割一塊 62mm x 69mm 的 PETG 板,用於支持開發板和鋰電池。固定 ESP32 開發板/esp32-nesemu1、在原始碼文件夾中,運行 「make menuconfig」2、選擇 「Nofrendo ESP32-specific configuration」
  • Espressif ESP32:使用EMFI繞過Secure Boot
    首先從一種經典的方法開始,我們使用完全受控制的測試代碼作為目標,確認ESP32是否具有對電磁Glitch的彈性(魯棒性)。如果能夠確定ESP32存在風險,我們就可以將2019年的研究成果付諸實踐。首選要做的,是繞過ESP32的Secure Boot實現。在我們開始研究時,就有幾位研究人員已經發布了針對這種實現的FI攻擊,Espressif也為此發布了公告。
  • esp32和stm32哪個好_ESP32對比ESP8266
    esp32和stm32哪個好_ESP32對比ESP8266 單片機愛好者 發表於 2020-04-23 11:06:19   esp32和stm32哪個好
  • ESP32-C3 學習測試(二、GPIO中斷、按鍵驅動測試)
    1.1.2  ESP32-C3應用程式啟動流程(更正上面錯誤說法!)對於文中以前提到的使用了FreeRTOS ,但是沒有開始調度的說法,是錯誤的!進行改正!函數app_mian其實只是一個FreeRTOS的一個任務!系統跑到app_mian的時候早就開始了調度!!!
  • 基於 ESP32 的WIFI控制智能門牌
    關於零件和設備的注意事項:基於 WeMos D1 R32 ESP32:我選擇了基於 ESP32 的板,它需要藍牙或 WIFI 的零外部突破,但如果您熟悉 Arduino 板 - 這是一個簡單的項目,可以移植和使用 ESP 突破。在設計過程中,我使用了各種品牌和類型的基於 ESP32 的開發板,沒有給我任何問題。
  • esp32管腳詳解
    關於如何使用ESP32 GPIO有很多問題。你應該用什麼pin?在項目中應該避免使用哪些pin?本文旨在成為一個為ESP32的GPIO提供一個簡單易懂的參考指南。下圖顯示了ESP-WROOM-32引腳。
  • 故障燈esp什麼意思
    esp系統涉及到的傳感器很多,所以一般故障原因都是出在傳感器上面,可能是接線頭鬆脫傳感器功能失效、也有可能是誤報等等。esp又稱電子穩定程序,它通過對從各傳感器傳來的車輛行駛狀態信息進行分析,然後向abs、ebd等發出糾偏指令,來幫助車輛維持動態平衡。esp可以使車輛在各種狀況下保持最佳的穩定性,在轉向過度或轉向不足的情形下效果更加明顯。
  • 32位以及64位棧遷移的具體分析與學習
    leave; //mov esp,ebp; pop ebp;ret ; // pop eip棧遷移 的核心思想就是 將棧 的 esp 和 ebp 轉移到一個 輸入不受長度限制的 且可控制 的 址處,通常是 bss 段地址!
  • 奔馳C級esp停止運行
    奔馳C級esp停止運行?汽車網小編為您來解答。 奔馳C級esp指的是車身電子穩定系統(外文名Electronic Stability Program,簡稱ESP),通常是支持ABS及ASR的功能。它通過對從各傳感器傳來的車輛行駛狀態信息進行分析,然後向ABS、ASR發出糾偏指令,來幫助車輛維持動態平衡。