ESP32_BLE_UART/main/uart_ens1.c

141 lines
4.3 KiB
C
Raw Normal View History

2025-09-30 13:56:56 +08:00
/*
* 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;
}