#pragma once #include "driver/gpio.h" #include "driver/uart.h" #include "esp_log.h" #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "light.c" #include "string.h" static const int UART_1_RX_BUF_SIZE = 1024; #define CI_03T_TXD_PIN (CONFIG_UART_TX) #define CI_03T_RXD_PIN (CONFIG_UART_RX) #define CI_03T_UART_NUM (CONFIG_UART_NUM) #define SEND_DATA_FRAME_HEAD \ (uint8_t[]) { 0xaa, 0x55 } #define SEND_DATA_FRAME_TAIL \ (uint8_t[]) { 0x55, 0xaa } #define CI_O3T_LOG_TAG "CI_03T" // emtpy buffer for sending data uint8_t ci_03t_tx_buffer[20] = {0}; int ci_03t_send_data(const uint8_t *data, uint8_t data_len) { memcpy(ci_03t_tx_buffer, SEND_DATA_FRAME_HEAD, sizeof(SEND_DATA_FRAME_HEAD)); memcpy(ci_03t_tx_buffer + sizeof(SEND_DATA_FRAME_HEAD), data, data_len); memcpy(ci_03t_tx_buffer + sizeof(SEND_DATA_FRAME_HEAD) + data_len, SEND_DATA_FRAME_TAIL, sizeof(SEND_DATA_FRAME_TAIL)); const int len = sizeof(SEND_DATA_FRAME_HEAD) + data_len + sizeof(SEND_DATA_FRAME_TAIL); const int txBytes = uart_write_bytes(CI_03T_UART_NUM, ci_03t_tx_buffer, len); ESP_LOGI(CI_O3T_LOG_TAG, "Wrote %d bytes", txBytes); ESP_LOG_BUFFER_HEXDUMP(CI_O3T_LOG_TAG, ci_03t_tx_buffer, len, ESP_LOG_INFO); return txBytes; } int sendData(const char *data) { const int len = strlen(data); const int txBytes = uart_write_bytes(CI_03T_UART_NUM, data, len); ESP_LOGI("TEST", "Wrote %d bytes", txBytes); return txBytes; } static void tx_task(void *arg) { static const char *TX_TASK_TAG = "TX_TASK"; esp_log_level_set(TX_TASK_TAG, ESP_LOG_INFO); while (1) { vTaskDelay(100 / portTICK_PERIOD_MS); // sendData(TX_TASK_TAG, "Hello world"); } } static void rx_task(void *arg) { static const char *RX_TASK_TAG = "RX_TASK"; esp_log_level_set(RX_TASK_TAG, ESP_LOG_INFO); uint8_t *data = (uint8_t *)malloc(UART_1_RX_BUF_SIZE + 1); uint8_t tx_buff[4] = {0}; while (1) { const int rxBytes = uart_read_bytes( CI_03T_UART_NUM, data, UART_1_RX_BUF_SIZE, 100 / portTICK_PERIOD_MS); if (rxBytes > 0) { data[rxBytes] = 0; ESP_LOGI(RX_TASK_TAG, "Read %d bytes: '%s'", rxBytes, data); ESP_LOG_BUFFER_HEXDUMP(RX_TASK_TAG, data, rxBytes, ESP_LOG_INFO); if (data[0] == 0x98 && data[1] == 0x77 && data[rxBytes - 1] == 0x98 && data[rxBytes - 2] == 0x77) { if (data[2] == 0x10) { // 氛围灯模式 if (data[3] == 0x02) { // 开灯、正常模式 tx_buff[0] = 0x05; led_strip_set_brightness(150); ci_03t_send_data(tx_buff, 1); continue; } if (data[3] == 0x01) { // 开灯、正常模式 tx_buff[0] = 0x06; led_strip_set_brightness(20); ci_03t_send_data(tx_buff, 1); continue; } if (data[3] == 0x00) { // 关灯 led_strip_set_brightness(0); tx_buff[0] = 0x04; ci_03t_send_data(tx_buff, 1); continue; } } ESP_LOGW(RX_TASK_TAG, "Unknow command"); } else { ESP_LOGW(RX_TASK_TAG, "Invalid data"); } } } free(data); } void ci_03t_init() { const uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_ODD, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, }; // We won't use a buffer for sending data. uart_driver_install(CI_03T_UART_NUM, UART_1_RX_BUF_SIZE * 2, 0, 0, NULL, 0); uart_param_config(CI_03T_UART_NUM, &uart_config); uart_set_pin(CI_03T_UART_NUM, CI_03T_TXD_PIN, CI_03T_RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); xTaskCreate(rx_task, "uart_rx_task", 1024 * 2, NULL, configMAX_PRIORITIES, NULL); }