mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'feature/uart_example_separate_tx_rx_tasks' into 'master'
Added an asynchronous UART example, using separate RX and TX tasks. See merge request !1403
This commit is contained in:
commit
62e24370f1
8
examples/peripherals/uart_async_rxtxtasks/Makefile
Normal file
8
examples/peripherals/uart_async_rxtxtasks/Makefile
Normal file
@ -0,0 +1,8 @@
|
||||
#
|
||||
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
|
||||
# project subdirectory.
|
||||
#
|
||||
|
||||
PROJECT_NAME := uart_async_rxtxtasks
|
||||
|
||||
include $(IDF_PATH)/make/project.mk
|
21
examples/peripherals/uart_async_rxtxtasks/README.md
Normal file
21
examples/peripherals/uart_async_rxtxtasks/README.md
Normal file
@ -0,0 +1,21 @@
|
||||
UART asynchronous example, that uses separate RX and TX tasks
|
||||
=============================================================
|
||||
|
||||
Starts two FreeRTOS tasks:
|
||||
- One task for transmitting 'Hello world' via the UART.
|
||||
- One task for receiving from the UART.
|
||||
|
||||
If you'd like to see your ESP32 receive something, simply short
|
||||
TXD_PIN and RXD_PIN. By doing this data transmitted on TXD_PIN will
|
||||
be received on RXD_PIN. See the definitions of TXD_PIN and RXD_PIN
|
||||
in ./main/uart_async_rxtxtasks_main.c.
|
||||
|
||||
The output for such configuration will look as follows:
|
||||
|
||||
```
|
||||
I (3261) TX_TASK: Wrote 11 bytes
|
||||
I (4261) RX_TASK: Read 11 bytes: 'Hello world'
|
||||
I (4261) RX_TASK: 0x3ffb821c 48 65 6c 6c 6f 20 77 6f 72 6c 64 |Hello world|
|
||||
...
|
||||
```
|
||||
The third line above prints received data in hex format, that comes handy to display non printable data bytes.
|
@ -0,0 +1,3 @@
|
||||
#
|
||||
# Main Makefile. This is basically the same as a component makefile.
|
||||
#
|
@ -0,0 +1,75 @@
|
||||
/* UART asynchronous example, that uses separate RX and TX tasks
|
||||
|
||||
This example code is in the Public Domain (or CC0 licensed, at your option.)
|
||||
|
||||
Unless required by applicable law or agreed to in writing, this
|
||||
software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||||
CONDITIONS OF ANY KIND, either express or implied.
|
||||
*/
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_system.h"
|
||||
#include "esp_log.h"
|
||||
#include "driver/uart.h"
|
||||
#include "soc/uart_struct.h"
|
||||
#include "string.h"
|
||||
|
||||
static const int RX_BUF_SIZE = 1024;
|
||||
|
||||
#define TXD_PIN (GPIO_NUM_4)
|
||||
#define RXD_PIN (GPIO_NUM_5)
|
||||
|
||||
void init() {
|
||||
const 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_1, &uart_config);
|
||||
uart_set_pin(UART_NUM_1, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
|
||||
// We won't use a buffer for sending data.
|
||||
uart_driver_install(UART_NUM_1, RX_BUF_SIZE * 2, 0, 0, NULL, 0);
|
||||
}
|
||||
|
||||
int sendData(const char* logName, const char* data)
|
||||
{
|
||||
const int len = strlen(data);
|
||||
const int txBytes = uart_write_bytes(UART_NUM_1, data, len);
|
||||
ESP_LOGI(logName, "Wrote %d bytes", txBytes);
|
||||
return txBytes;
|
||||
}
|
||||
|
||||
static void tx_task()
|
||||
{
|
||||
static const char *TX_TASK_TAG = "TX_TASK";
|
||||
esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO);
|
||||
while (1) {
|
||||
sendData(TX_TASK_TAG, "Hello world");
|
||||
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
|
||||
static void rx_task()
|
||||
{
|
||||
static const char *RX_TASK_TAG = "RX_TASK";
|
||||
esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO);
|
||||
uint8_t* data = (uint8_t*) malloc(RX_BUF_SIZE+1);
|
||||
while (1) {
|
||||
const int rxBytes = uart_read_bytes(UART_NUM_1, data, RX_BUF_SIZE, 1000 / portTICK_RATE_MS);
|
||||
if (rxBytes > 0) {
|
||||
data[rxBytes] = 0;
|
||||
ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data);
|
||||
ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO);
|
||||
}
|
||||
}
|
||||
free(data);
|
||||
}
|
||||
|
||||
void app_main()
|
||||
{
|
||||
init();
|
||||
xTaskCreate(rx_task, "uart_rx_task", 1024*2, NULL, configMAX_PRIORITIES, NULL);
|
||||
xTaskCreate(tx_task, "uart_tx_task", 1024*2, NULL, configMAX_PRIORITIES-1, NULL);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user