esp32s3 idf uart串口通信demo
esp32s3 idf uart串口通信demo
gpio21低电平时出发发送串口信息
#include <stdio.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "driver/uart.h" #include "esp_log.h" #define TX_PIN 14 #define RX_PIN 48 #define TRIG_PIN 21 #define UART_PORT_NUM UART_NUM_1 #define UART_BAUD_RATE 115200 #define BUF_SIZE 128 static const char *TAG = "uart_edge_trigger"; void app_main(void) { // 配置触发引脚:输入 + 上拉(默认高) gpio_set_direction(TRIG_PIN, GPIO_MODE_INPUT); gpio_pullup_en(TRIG_PIN); // UART 初始化(同前) uart_config_t uart_config = { .baud_rate = UART_BAUD_RATE, .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, }; uart_param_config(UART_PORT_NUM, &uart_config); uart_set_pin(UART_PORT_NUM, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_PORT_NUM, 256, 0, 0, NULL, 0); ESP_LOGI(TAG, "System ready. Waiting for falling edge on GPIO21..."); const char *msg = "cdtxw_duoji2\n"; uint8_t rx_data[BUF_SIZE]; int len; // 记录上一次的电平状态 int last_level = gpio_get_level(TRIG_PIN); // 初始为高(1) while (1) { int current_level = gpio_get_level(TRIG_PIN); // 检测下降沿:上一次是高,当前是低 if (last_level == 1 && current_level == 0) { // 可选:简单去抖(读取稳定低电平) vTaskDelay(pdMS_TO_TICKS(20)); // 20ms 去抖 if (gpio_get_level(TRIG_PIN) == 0) { // 确认仍是低 ESP_LOGI(TAG, "Falling edge detected! Sending data..."); uart_write_bytes(UART_PORT_NUM, msg, strlen(msg)); } } // 更新状态 last_level = current_level; // 同时处理接收数据 len = uart_read_bytes(UART_PORT_NUM, rx_data, BUF_SIZE - 1, pdMS_TO_TICKS(10)); if (len > 0) { rx_data[len] = '\0'; ESP_LOGI(TAG, "Received: %s", rx_data); } vTaskDelay(pdMS_TO_TICKS(5)); } }
欢迎讨论,相互学习。
cdtxw@foxmail.com

浙公网安备 33010602011771号