141 lines
4.3 KiB
C
141 lines
4.3 KiB
C
|
|
/*
|
|||
|
|
* 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;
|
|||
|
|
}
|