ESP32_BLE_UART/main/uart_ens1.c

141 lines
4.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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;
}