diff --git a/components/FluxProtocol/FluxProtocol.c b/components/FluxProtocol/FluxProtocol.c index 500703b..36befa1 100644 --- a/components/FluxProtocol/FluxProtocol.c +++ b/components/FluxProtocol/FluxProtocol.c @@ -112,6 +112,11 @@ void bs_test_task(void* arg) while(1) { + /* 调节呼吸模拟器频率 */ + ModbusRTU_Send_0x05(bs_addr_all[testCount]); + lv_label_set_text_fmt(ui_pageHome_labelBSInfo,"%s %s",test_rate[testCount],test_info[5]); + vTaskDelay(5000 / portTICK_PERIOD_MS); + /* 下发测试时间 */ flux_test_time_set(flux_test_time_series[testCount]); vTaskDelay(1000 / portTICK_PERIOD_MS); diff --git a/components/FluxProtocol/FluxProtocol.h b/components/FluxProtocol/FluxProtocol.h index c818397..f0cb809 100644 --- a/components/FluxProtocol/FluxProtocol.h +++ b/components/FluxProtocol/FluxProtocol.h @@ -38,6 +38,14 @@ extern "C" { #define SPIRIT_6_STAGE_NUM 6 #define SPIRIT_8_STAGE_NUM 8 +/* 定义呼吸模拟器六个挡位控制所在Modbus地址 */ +#define BS_ADDR_15BPM 0x080B +#define BS_ADDR_20BPM 0x080C +#define BS_ADDR_25BPM 0x080D +#define BS_ADDR_30BPM 0x080E +#define BS_ADDR_35BPM 0x080F +#define BS_ADDR_40BPM 0x0810 + /* 定义枚举用于标记呼吸频率 */ typedef enum Bs_test_Rate{ BS_RATE_15BPM, @@ -99,8 +107,11 @@ extern float Spirit3_Volume[4]; extern float Spirit6_Volume[6]; extern float YULite8_Volume[6]; +/* 导出呼吸模拟器控制地址 */ +extern uint32_t bs_addr_all[6]; + /* 导出消息数据*/ -extern char *test_info[]; +extern char *test_info[6]; /* 导出LED小灯控制句柄 */ extern TaskHandle_t bs_stateLED_task_handle; diff --git a/components/FluxProtocol/FluxProtocol_data.c b/components/FluxProtocol/FluxProtocol_data.c index c35e0a0..a287a6b 100644 --- a/components/FluxProtocol/FluxProtocol_data.c +++ b/components/FluxProtocol/FluxProtocol_data.c @@ -23,6 +23,9 @@ float Spirit3_Volume[4] = { 210,420,630,750}; float Spirit6_Volume[6] = { 210,420,630,840,1050,1200}; float YULite8_Volume[6] = { 210,420,630,750,870,990,1110,990}; +/* 定义用于存储呼吸模拟器频率控制的Modbus寄存器地址 */ +uint32_t bs_addr_all[6] = { BS_ADDR_15BPM,BS_ADDR_20BPM,BS_ADDR_25BPM,BS_ADDR_30BPM,BS_ADDR_35BPM,BS_ADDR_40BPM}; + /* 用于存储三款机器挡位stage的数据 */ int32_t Spirit3_Stage[4] = { 1,2,3,4}; int32_t Spirit6_Stage[6] = { 1,2,3,4,5,6}; @@ -37,11 +40,12 @@ int32_t YULite8_Stage[8] = { 1,2,3,4,5,6,7,8}; * 5.所有频率测试完毕,请记录。 All frequency tests have been completed, please record. * 6.设备已启动成功,请开始测试。 Device started successfully, please start testing. */ -char *test_info[5] = {"Time setting Send",\ +char *test_info[6] = {"Time setting Send",\ "testing...",\ "wait for end",\ " frequency test finished",\ "all done",\ + "breath command sent" }; /* 测试呼吸频率 */ diff --git a/components/FluxUI/ui_event_homePage.c b/components/FluxUI/ui_event_homePage.c index 8453fe0..8a0290f 100644 --- a/components/FluxUI/ui_event_homePage.c +++ b/components/FluxUI/ui_event_homePage.c @@ -514,6 +514,8 @@ void on_buttonStartTestBS_clicked(lv_event_t * e) is_bs_test_ing = true; lv_label_set_text(ui_pageHome_labelStartTest1,"Cancel Test BS"); + /* 清空已完成的测试结果 */ + BS_ALL_RESULT_CLEAR; } #if 0 diff --git a/components/FluxUart/FluxUart.c b/components/FluxUart/FluxUart.c index 2cc6931..8379527 100644 --- a/components/FluxUart/FluxUart.c +++ b/components/FluxUart/FluxUart.c @@ -133,7 +133,7 @@ void uart1_echoTask(void* arg) }; int intr_alloc_flags = 0; - ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM1, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags)); + ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM1, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, intr_alloc_flags)); ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM1, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM1, ECHO_TEST_TXD1, ECHO_TEST_RXD1, ECHO_TEST_RTS, ECHO_TEST_CTS)); @@ -351,30 +351,29 @@ void uart2_echoTask(void* arg) }; int intr_alloc_flags = 0; - ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM2, BUF_SIZE * 2, 0, 0, NULL, intr_alloc_flags)); + ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM2, BUF_SIZE * 2, BUF_SIZE * 2, 0, NULL, intr_alloc_flags)); ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM2, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM2, ECHO_TEST_TXD2, ECHO_TEST_RXD2, ECHO_TEST_RTS, ECHO_TEST_CTS)); uint8_t *data = (uint8_t *) malloc(BUF_SIZE); + ESP_LOGI("uart2_echoTask", "UART2 ECHO TEST: start test"); + #if LOG_RECORD_ENABLE example_write_log("呼吸模拟器消息处理任务初始化完毕",__FILE__,__LINE__); #endif while (1) { + vTaskDelay(1000 / portTICK_PERIOD_MS); + // Read data from the UART int len = uart_read_bytes(ECHO_UART_PORT_NUM2, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS); // Write data back to the UART uart_write_bytes(ECHO_UART_PORT_NUM2, (const char *) data, len); - - if (len) - { - data[len] = '\0'; - lv_textarea_add_char(ui_pageFluxDebug_textAreaContent,'\n'); - lv_textarea_add_text(ui_pageFluxDebug_textAreaContent, (char *) data); - } + + ESP_LOGI("uart2_echoTask", "Read %d bytes: '%s'", len, data); } } @@ -420,6 +419,7 @@ esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *fram return ESP_OK; } +#if USART_USE_10_COMMAND /** * @brief 封装多寄存器写函数 0x10指令 * @@ -450,6 +450,47 @@ esp_err_t ModbusRTU_Send_0x10(uart_port_t uart_num, struct ModbusRTU_Frame2Reg * ESP_LOGI("uart_write_bytes", "uart_write_bytes success"); return ESP_OK; } +#endif + +/** + * @brief 封装05指令,修改单个寄存器开关量 + * + * @param[in] uart_num 串口号 + * @param[in] frame 需要发送的数据帧 + * + */ +esp_err_t ModbusRTU_Send_0x05(uint32_t ADDR) +{ + struct ModbusRTU_Frame frame; + unsigned short crc; + + frame.ADDR = 0x01; + frame.FUNC = 0x05; + + /* 寄存器所在地址 */ + frame.DATA[0] = (ADDR >> 8); + frame.DATA[1] = (ADDR & 0xFF); + + /* 启动命令 */ + frame.DATA[2] = 0xFF; + frame.DATA[3] = 0x00; + + crc = CRC16((unsigned char *)&frame, sizeof(frame.ADDR) + sizeof(frame.FUNC) + sizeof(frame.DATA)); + frame.CRC[1] = (crc & 0xFF); + frame.CRC[0] = (crc >> 8); + + int res = uart_write_bytes(ECHO_UART_PORT_NUM2, (const char *)&frame, sizeof(struct ModbusRTU_Frame)/sizeof(unsigned char)); + if (res == -1) + { + return ESP_FAIL; + example_write_log("05指令数据发送失败。",__FILE__,__LINE__); + ESP_LOGI("uart_write_bytes", "uart_write_bytes fail"); + } + + example_write_log("05指令数据发送成功。",__FILE__,__LINE__); + + return ESP_OK; +} /** * @brief 根据主界面内容刷新测试结果 diff --git a/components/FluxUart/FluxUart.h b/components/FluxUart/FluxUart.h index 1ec0914..6ef2e4c 100644 --- a/components/FluxUart/FluxUart.h +++ b/components/FluxUart/FluxUart.h @@ -28,6 +28,8 @@ extern "C" { /* 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) @@ -36,13 +38,25 @@ extern "C" { #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 (16*1024) +#define ECHO_TASK_STACK_SIZE (8*1024) /* 选择使用大端/小端模式 */ #define BIG_ENDIAN_USED 0 @@ -208,6 +222,7 @@ unsigned short CRC16(unsigned char* pchMsg, unsigned short wDataLen); */ esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *frame); +#if USART_USE_10_COMMAND /** * @brief 封装多寄存器写函数 0x10指令 * @@ -216,6 +231,16 @@ esp_err_t ModbusRTU_Send_0306(uart_port_t uart_num, struct ModbusRTU_Frame *fram * */ 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 根据主界面内容刷新测试结果 diff --git a/main/main.cpp b/main/main.cpp index 91f92bc..0a71b20 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -138,8 +138,8 @@ extern "C" void app_main(void) xTaskCreate(nom_test_led_task, "nom_test_led_task", 4 * 1024, NULL, 2, &nom_stateLED_task_handle); vTaskSuspend(nom_stateLED_task_handle); - #if 0/*暂时不支持呼吸模拟器*/ - /*创建UART2响应任务*/ + #if 1/* 支持呼吸模拟器 */ + /* 创建UART2响应任务 */ xTaskCreate(uart2_echoTask, "uart2_echo_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); lv_bar_set_value(ui_pageWelCome_barStartProgress,100,LV_ANIM_ON); lv_label_set_text(ui_pageWelCome_labelStartInfo,"serial port task 100%"); diff --git a/sdkconfig b/sdkconfig index d73556f..f10b0c1 100644 --- a/sdkconfig +++ b/sdkconfig @@ -1125,7 +1125,7 @@ CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_ESP_MAIN_TASK_STACK_SIZE=65536 +CONFIG_ESP_MAIN_TASK_STACK_SIZE=4096 CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y # CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set # CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set @@ -2442,7 +2442,7 @@ CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160=y CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=160 CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304 -CONFIG_MAIN_TASK_STACK_SIZE=65536 +CONFIG_MAIN_TASK_STACK_SIZE=4096 CONFIG_CONSOLE_UART_DEFAULT=y # CONFIG_CONSOLE_UART_CUSTOM is not set # CONFIG_CONSOLE_UART_NONE is not set