/* * UART ENS1通信模块 * 用于ESP32-S3与ENS1芯片的UART通信 */ #include "uart_ens1.h" #include "esp_log.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #include "string.h" #include "stdlib.h" static const char *TAG = "UART_ENS1"; // 全局UART连接状态 volatile bool ens1_uart_connected = false; QueueHandle_t uart_ens1_queue = NULL; // UART初始化 (连接ENS1芯片) esp_err_t init_uart_ens1(void) { const uart_config_t uart_config = { .baud_rate = UART_ENS1_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, }; ESP_LOGI(TAG, "初始化UART%d用于ENS1芯片通信...", UART_ENS1_NUM); ESP_LOGI(TAG, "配置: 波特率=%d, TXD=GPIO%d, RXD=GPIO%d", UART_ENS1_BAUD_RATE, UART_ENS1_TXD_PIN, UART_ENS1_RXD_PIN); ESP_LOGI(TAG, "UART参数: 8位数据位, 1位停止位, 无校验位, 无流控"); // 安装UART驱动,接收缓冲区 = 2*RX_BUF_SIZE,发送缓冲区 = 0 esp_err_t ret = uart_driver_install(UART_ENS1_NUM, UART_ENS1_RX_BUF_SIZE * 2, 0, 10, &uart_ens1_queue, 0); if (ret != ESP_OK) { ESP_LOGE(TAG, "UART驱动安装失败: %s", esp_err_to_name(ret)); return ret; } // 配置UART参数 ret = uart_param_config(UART_ENS1_NUM, &uart_config); if (ret != ESP_OK) { ESP_LOGE(TAG, "UART参数配置失败: %s", esp_err_to_name(ret)); return ret; } // 设置UART引脚 ret = uart_set_pin(UART_ENS1_NUM, UART_ENS1_TXD_PIN, UART_ENS1_RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); if (ret != ESP_OK) { ESP_LOGE(TAG, "UART引脚设置失败: %s", esp_err_to_name(ret)); return ret; } ESP_LOGI(TAG, "✅ UART%d初始化成功,准备与ENS1通信", UART_ENS1_NUM); ens1_uart_connected = true; return ESP_OK; } // 发送数据到ENS1芯片 (通过UART) esp_err_t uart_send_data_to_ens1(uint8_t *data, size_t len) { if (data == NULL || len == 0) { ESP_LOGE(TAG, "无效的数据或长度"); return ESP_ERR_INVALID_ARG; } ESP_LOGI(TAG, "发送UART数据到ENS1,长度: %d 字节", len); ESP_LOG_BUFFER_HEX("ENS1发送数据", data, len); const int txBytes = uart_write_bytes(UART_ENS1_NUM, (const char*)data, len); if (txBytes < 0) { ESP_LOGE(TAG, "UART数据发送失败"); ens1_uart_connected = false; return ESP_FAIL; } ESP_LOGI(TAG, "✅ UART数据发送成功,实际发送: %d 字节", txBytes); return ESP_OK; } // ENS1 UART接收任务 void uart_ens1_rx_task(void *arg) { static const char *RX_TASK_TAG = "UART_ENS1_RX"; esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO); uint8_t *data = (uint8_t *) malloc(UART_ENS1_RX_BUF_SIZE + 1); if (data == NULL) { ESP_LOGE(RX_TASK_TAG, "内存分配失败"); vTaskDelete(NULL); return; } ESP_LOGI(RX_TASK_TAG, "ENS1 UART接收任务启动"); while (1) { const int rxBytes = uart_read_bytes(UART_ENS1_NUM, data, UART_ENS1_RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS); if (rxBytes > 0) { data[rxBytes] = 0; ESP_LOGI(RX_TASK_TAG, "从ENS1接收到 %d 字节数据", rxBytes); ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO); } } free(data); vTaskDelete(NULL); } // 检查ENS1 UART连接状态 esp_err_t check_ens1_uart_connection(void) { if (!ens1_uart_connected) { ESP_LOGW(TAG, "ENS1 UART未连接"); return ESP_ERR_INVALID_STATE; } // 发送测试命令检测连接 uint8_t test_cmd[] = {0xAA, 0x55, 0x01, 0x02}; // ENS1连接检测命令 int txBytes = uart_write_bytes(UART_ENS1_NUM, (const char*)test_cmd, sizeof(test_cmd)); if (txBytes == sizeof(test_cmd)) { ESP_LOGI(TAG, "✅ ENS1 UART连接正常"); return ESP_OK; } else { ESP_LOGW(TAG, "⚠️ ENS1 UART连接异常"); ens1_uart_connected = false; return ESP_FAIL; } } // 获取ENS1 UART连接状态 bool get_ens1_uart_connection_status(void) { return ens1_uart_connected; } // 设置ENS1 UART连接状态 void set_ens1_uart_connection_status(bool status) { ens1_uart_connected = status; }