ESP-IDF串口中断接收
串口接收并回传,定时发送数据
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/uart.h"
#include "esp_log.h"
#include "driver/gpio.h"
static const char *TAG = "uart_events";#define EX_UART_NUM UART_NUM_1
#define PATTERN_CHR_NUM (3) /*!< Set the number of consecutive and identical characters received by receiver which defines a UART pattern*/#define BUF_SIZE (1024)
#define RD_BUF_SIZE (BUF_SIZE)
static QueueHandle_t uart0_queue;static void uart_event_task(void *pvParameters)
{uart_event_t event;size_t buffered_size;uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE);for (;;) {//Waiting for UART event.if (xQueueReceive(uart0_queue, (void *)&event, (TickType_t)portMAX_DELAY)) {bzero(dtmp, RD_BUF_SIZE);ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);switch (event.type) {case UART_DATA:ESP_LOGI(TAG, "[UART DATA]: %d", event.size);uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);ESP_LOGI(TAG, "[DATA EVT]:");uart_write_bytes(EX_UART_NUM, (const char*) dtmp, event.size);break;//Event of HW FIFO overflow detectedcase UART_FIFO_OVF:ESP_LOGI(TAG, "hw fifo overflow");uart_flush_input(EX_UART_NUM);xQueueReset(uart0_queue);break;//Event of UART ring buffer fullcase UART_BUFFER_FULL:ESP_LOGI(TAG, "ring buffer full");uart_flush_input(EX_UART_NUM);xQueueReset(uart0_queue);break;//Event of UART RX break detectedcase UART_BREAK:ESP_LOGI(TAG, "uart rx break");break;//Event of UART parity check errorcase UART_PARITY_ERR:ESP_LOGI(TAG, "uart parity error");break;//Event of UART frame errorcase UART_FRAME_ERR:ESP_LOGI(TAG, "uart frame error");break;default:ESP_LOGI(TAG, "uart event type: %d", event.type);break;}}}free(dtmp);dtmp = NULL;vTaskDelete(NULL);
}/* 串口发送任务 */
void uart_T_task(void *p)
{uint8_t get_jsy_value[8] = {0x02, 0x03, 0x00, 0x48, 0x00, 0x05, 0x05, 0xEC};while (1){uart_write_bytes(EX_UART_NUM, get_jsy_value, 8);vTaskDelay(pdMS_TO_TICKS(1000));}
}void app_main(void)
{esp_log_level_set(TAG, ESP_LOG_INFO);/* 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_DEFAULT,};//Install UART driver, and get the queue.uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart0_queue, 0);uart_param_config(EX_UART_NUM, &uart_config);uart_set_pin(EX_UART_NUM, GPIO_NUM_17, GPIO_NUM_16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);//Create a task to handler UART event from ISRxTaskCreate(uart_event_task, "uart_event_task", 3072, NULL, 12, NULL);xTaskCreate(uart_T_task, "uart_T_task", 4046, NULL, 10, NULL);
}