/** * @file FluxUart.h * @brief 串口通讯头文件 * * 用于数据收发及解析工作(重要!) * * @author wang xiang en * @date 2025-04-19 * @version 版本号 * @copyright 版权声明((C)2025, YUWELL MEDTECH Co.ltd) */ #ifndef _FLUX_UART_H #define _FLUX_UART_H #ifdef __cplusplus extern "C" { #endif #include #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/uart.h" #include "driver/gpio.h" #include "sdkconfig.h" #include "esp_log.h" /* UART */ /* UART1 RT-2 TX-1*/ /* UART2 RT-46 TX-45*/ #if 1 #define ECHO_TEST_TXD2 GPIO_NUM_45 #define ECHO_TEST_RXD2 GPIO_NUM_46 #define ECHO_UART_PORT_NUM2 (UART_NUM_2) #define ECHO_TEST_TXD1 GPIO_NUM_1 #define ECHO_TEST_RXD1 GPIO_NUM_2 #define ECHO_UART_PORT_NUM1 (UART_NUM_1) #else #define ECHO_TEST_TXD2 GPIO_NUM_1 #define ECHO_TEST_RXD2 GPIO_NUM_2 #define ECHO_UART_PORT_NUM2 (UART_NUM_2) #define ECHO_TEST_TXD1 GPIO_NUM_45 #define ECHO_TEST_RXD1 GPIO_NUM_46 #define ECHO_UART_PORT_NUM1 (UART_NUM_1) #endif /*不使用RTS CTS*/ #define ECHO_TEST_RTS (UART_PIN_NO_CHANGE) #define ECHO_TEST_CTS (UART_PIN_NO_CHANGE) /* 通讯参数设置 */ #define ECHO_UART_BAUD_RATE (9600) #define ECHO_TASK_STACK_SIZE (8*1024) /* 选择使用大端/小端模式 */ #define BIG_ENDIAN_USED 0 #define LITTLE_ENDIAN_USED !BIG_ENDIAN_USED /* 流量计通讯参数设定 地址、功能码 */ #define FLUX_ADDR 0x01 #define FLUX_FUNC_READ 0x03 #define FLUX_FUNC_SET 0x10 #define FLUX_FUNC_SET_SINGLE 0x06 /* 启动指令下发事件组标志位 */ #define START_TEST_EVENT_BIT BIT0 /* 定义缓冲大小 */ #define BUF_SIZE (1024) /*定义工作模式*/ enum FluxMachineWorkMode{ FLUX_MODE_NORMAL, FLUX_MODE_TIMER, FLUX_MODE_VOLUME, FLUX_MODE_REV, }; /** * @brief RTU通讯帧 * */ struct ModbusRTU_Frame { unsigned char ADDR; unsigned char FUNC; unsigned char DATA[4]; unsigned char CRC[2]; }; /** * @brief 32位RTU通讯帧 * */ struct ModbusRTU_Frame2Reg { unsigned char ADDR; unsigned char FUNC; unsigned short regAddr; unsigned short regNum; uint8_t ByteNum; uint8_t DATA[4]; unsigned char CRC[2]; }; /** * @brief 当前机器状态 * */ struct FluxMachineData { enum FluxMachineWorkMode workMode; float time; float volume; float rev; float breathTimes; int32_t breathRate; unsigned short finishFlag; float liquidTemperature; float cumulativeVolume; }; /* 记录当前呼吸频率、累计流量、累计体积、累计时间等数据 */ extern struct FluxMachineData FluxMachineData; /* 通讯帧结构体 */ extern struct ModbusRTU_Frame2Reg flux_frame2Reg; /* 通讯帧结构体 */ extern struct ModbusRTU_Frame flux_frame; extern struct ModbusRTU_Frame breath_frame; /* 定义用于下发启动指令的帧 */ extern struct ModbusRTU_Frame flux_frame_start; /* 启动指令下发事件组 */ extern EventGroupHandle_t start_state_event_group; /* 导出当前工作模式的变量 */ extern bool is_test_mode_nom; /** * @brief 启动指令下发宏函数 * */ #define FLUX_TEST_START flux_frame_start.ADDR = FLUX_ADDR;\ flux_frame_start.FUNC = FLUX_FUNC_SET_SINGLE;\ \ flux_frame_start.DATA[0] = 0x00;\ flux_frame_start.DATA[1] = 0x01;\ flux_frame_start.DATA[2] = 0x00;\ flux_frame_start.DATA[3] = 0x01;\ ESP_ERROR_CHECK(ModbusRTU_Send_0306(ECHO_UART_PORT_NUM1,&flux_frame_start));\ ESP_LOGI("FLUX_TEST_START","send start"); /** * @brief 测试正确显示 * */ #define RESULT_RIGHT lv_obj_set_style_bg_color(ui_pageHome_panelTestResult,lv_color_hex(0x00FF00),LV_PART_MAIN);\ lv_label_set_text(ui_pageHome_labelTestResult,"V"); /** * @brief 测试错误显示 * */ #define RESULT_FAULT lv_obj_set_style_bg_color(ui_pageHome_panelTestResult,lv_color_hex(0xFF0000),LV_PART_MAIN);\ lv_label_set_text(ui_pageHome_labelTestResult,"X"); /* 定义主界面进度条显示控制函数 */ #define FLUX_PROGRESS_BAR_CONTROL(x) lv_bar_set_value(ui_pageHome_BarTestProgBS, x, LV_ANIM_ON); /** * @brief 串口1收发任务 (流量计) * * @param[in] arg not used * */ void uart1_echoTask(void* arg); /** * @brief 串口2收发任务 (呼吸模拟器) * * @param[in] arg not used * */ void uart2_echoTask(void* arg); /** * @brief 测试任务 * * @param[in] arg not used * */ void test_task(void *arg); /** * @brief CRC16 校验函数 * * @param[in] pchMsg 输入的数据 * @param[in] wDataLen 数据长度 * */ unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen); /** * @brief 封装03 06指令函数 单寄存器写、多寄存器读 * * @param[in] uart_num 串口号 * @param[in] frame 需要发送的数据帧 * */ esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *frame); #if USART_USE_10_COMMAND /** * @brief 封装多寄存器写函数 0x10指令 * * @param[in] uart_num 串口号 * @param[in] frame 需要发送的数据帧 * */ esp_err_t ModbusRTU_Send_0x10(uart_port_t uart_num, struct ModbusRTU_Frame2Reg *frame); #endif /** * @brief 封装05指令,修改单个寄存器开关量 * * @param[in] uart_num 串口号 * @param[in] frame 需要发送的数据帧 * */ esp_err_t ModbusRTU_Send_0x05(uint32_t ADDR); /** * @brief 根据主界面内容刷新测试结果 * */ esp_err_t RefreshResult(void); #ifdef __cplusplus } /*extern "C"*/ #endif #endif