From 94af947d1fa510e885beaea5799086e04de12968 Mon Sep 17 00:00:00 2001 From: bogd Date: Thu, 23 Jan 2025 20:10:39 +0200 Subject: [PATCH] serial port settings fixed --- src/RestApiHandler.c | 2 +- src/SerialPort.c | 166 ++++++++++++++++++++++++++----------------- 2 files changed, 100 insertions(+), 68 deletions(-) diff --git a/src/RestApiHandler.c b/src/RestApiHandler.c index 302e025..2565bae 100644 --- a/src/RestApiHandler.c +++ b/src/RestApiHandler.c @@ -552,7 +552,7 @@ const rest_var_t SystemVariables[] = { 0, "serial_enab", &SysConfig.serialSettings.Flags.IsSerialEnabled, VAR_BOOL, RW, 0, 1 }, { 0, "serial_bridge", &SysConfig.serialSettings.Flags.IsBridgeEnabled, VAR_BOOL, RW, 0, 1 }, { 0, "serial_mode", &funct_serial_mode, VAR_FUNCT, R, 1, 2 }, - { 0, "serial_baud", &SysConfig.serialSettings.BaudRate, VAR_INT, RW, 1200, 4096000 }, + { 0, "serial_baud", &SysConfig.serialSettings.BaudRate, VAR_INT, RW, 1200, 8192000 }, { 0, "serial_bits", &SysConfig.serialSettings.DataBits, VAR_INT, RW, 0, 3 }, { 0, "serial_parity", &SysConfig.serialSettings.Parity, VAR_INT, RW, 0, 3 }, diff --git a/src/SerialPort.c b/src/SerialPort.c index 11ce093..deaaedb 100644 --- a/src/SerialPort.c +++ b/src/SerialPort.c @@ -16,8 +16,8 @@ * \version 1.0 * \date 2023-10-15 * \author Bogdan Pilyugin - * \brief - * \details + * \brief + * \details * \copyright Apache License, Version 2.0 */ @@ -37,13 +37,13 @@ #include "webguiapp.h" #include "driver/gpio.h" -#define TAG "serial_port" -#define UART_READ_TOUT (100) // 3.5T * 8 = 28 ticks, TOUT=3 -> ~24..33 ticks -#define PATTERN_CHR_NUM (3) /*!< Set the number of consecutive and identical characters received by receiver which defines a UART pattern*/ +#define TAG "serial_port" +#define UART_READ_TOUT (80) // 3.5T * 8 = 28 ticks, TOUT=3 -> ~24..33 ticks +#define PATTERN_CHR_NUM (3) /*!< Set the number of consecutive and identical characters received by receiver which defines a UART pattern*/ -#define UART_TX_QUEUE_SIZE (5) -#define UART_RX_QUEUE_SIZE (5) -#define UART_DEBUG_MODE 0 +#define UART_TX_QUEUE_SIZE (5) +#define UART_RX_QUEUE_SIZE (5) +#define UART_DEBUG_MODE 0 #ifdef CONFIG_WEBGUIAPP_UART_TRANSPORT_ENABLE @@ -104,24 +104,23 @@ void serial_RX_task(void *arg) for (;;) { - //Waiting for UART event. - if (xQueueReceive(uart_event_queue, (void*) &event, portMAX_DELAY)) + // Waiting for UART event. + if (xQueueReceive(uart_event_queue, (void *)&event, portMAX_DELAY)) { #if UART_DEBUG_MODE == 1 ESP_LOGI(TAG, "uart[%d] event:%d", CONFIG_UART_PORT_NUM, event.type); #endif switch (event.type) { - //Event of UART receving data + // Event of UART receving data /*We'd better handler data event fast, there would be much more data events than other types of events. If we take too much time on data event, the queue might be full.*/ case UART_DATA: if (event.timeout_flag) { - bzero(rxbuf, CONFIG_WEBGUIAPP_UART_BUF_SIZE); - uart_get_buffered_data_len(CONFIG_WEBGUIAPP_UART_PORT_NUM, (size_t*) &buffered_size); + uart_get_buffered_data_len(CONFIG_WEBGUIAPP_UART_PORT_NUM, (size_t *)&buffered_size); if (buffered_size) { uart_read_bytes(CONFIG_WEBGUIAPP_UART_PORT_NUM, rxbuf, buffered_size, 100); @@ -136,11 +135,10 @@ void serial_RX_task(void *arg) } else ReceiveHandlerAPI(); - } } - break; - //Event of HW FIFO overflow detected + break; + // Event of HW FIFO overflow detected case UART_FIFO_OVF: #if UART_DEBUG_MODE == 1 @@ -151,36 +149,36 @@ void serial_RX_task(void *arg) // As an example, we directly flush the rx buffer here in order to read more data. uart_flush_input(CONFIG_WEBGUIAPP_UART_PORT_NUM); xQueueReset(uart_event_queue); - break; - //Event of UART ring buffer full + break; + // Event of UART ring buffer full case UART_BUFFER_FULL: ESP_LOGE(TAG, "ring buffer full"); // If buffer full happened, you should consider encreasing your buffer size // As an example, we directly flush the rx buffer here in order to read more data. uart_flush_input(CONFIG_WEBGUIAPP_UART_PORT_NUM); xQueueReset(uart_event_queue); - break; - //Event of UART RX break detected + break; + // Event of UART RX break detected case UART_BREAK: - #if UART_DEBUG_MODE == 1 +#if UART_DEBUG_MODE == 1 ESP_LOGI(TAG, "uart rx break"); #endif - break; - //Event of UART parity check error + break; + // Event of UART parity check error case UART_PARITY_ERR: ESP_LOGE(TAG, "uart parity error"); - break; - //Event of UART frame error + break; + // Event of UART frame error case UART_FRAME_ERR: ESP_LOGE(TAG, "uart frame error"); - break; - //UART_PATTERN_DET + break; + // UART_PATTERN_DET case UART_PATTERN_DET: - uart_get_buffered_data_len(CONFIG_WEBGUIAPP_UART_PORT_NUM, (size_t*) &buffered_size); + uart_get_buffered_data_len(CONFIG_WEBGUIAPP_UART_PORT_NUM, (size_t *)&buffered_size); int pos = uart_pattern_pop_pos(CONFIG_WEBGUIAPP_UART_PORT_NUM); #if UART_DEBUG_MODE == 1 - ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", (int )pos, (int )buffered_size); + ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", (int)pos, (int)buffered_size); #endif if (pos == -1) { @@ -201,11 +199,11 @@ void serial_RX_task(void *arg) #endif } - break; - //Others + break; + // Others default: ESP_LOGW(TAG, "uart event type: %d", event.type); - break; + break; } } } @@ -218,8 +216,7 @@ void static serial_TX_task(void *arg) while (1) { xQueueReceive(UARTtxQueueHandle, &DSS, portMAX_DELAY); - if (uart_write_bytes(CONFIG_WEBGUIAPP_UART_PORT_NUM, DSS.raw_data_ptr, DSS.data_length) - != DSS.data_length) + if (uart_write_bytes(CONFIG_WEBGUIAPP_UART_PORT_NUM, DSS.raw_data_ptr, DSS.data_length) != DSS.data_length) ESP_LOGE(TAG, "RS485 write data failure"); free(DSS.raw_data_ptr); if (uart_wait_tx_done(CONFIG_WEBGUIAPP_UART_PORT_NUM, pdMS_TO_TICKS(1000)) != ESP_OK) @@ -230,51 +227,86 @@ void static serial_TX_task(void *arg) void InitSerialPort(void) { uart_config_t uart_config = { - .baud_rate = GetSysConf()->serialSettings.BaudRate, - .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_APB, + .baud_rate = GetSysConf()->serialSettings.BaudRate, + .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_APB, }; - //uart_config.data_bits = (uint8_t) GetSysConf()->serialSettings.DataBits; - //uart_config.parity = (uint8_t) GetSysConf()->serialSettings.Parity; - //uart_config.stop_bits = (uint8_t) GetSysConf()->serialSettings.StopBits; + //uart_config.data_bits = (uint8_t)GetSysConf()->serialSettings.DataBits; - ESP_LOGI(TAG, "UART data_bits:%d parity:%d stop_bits:%d", - GetSysConf()->serialSettings.DataBits, - GetSysConf()->serialSettings.Parity, - GetSysConf()->serialSettings.StopBits); + switch (GetSysConf()->serialSettings.DataBits) + { + case 0: + uart_config.data_bits = UART_DATA_5_BITS; + break; + case 1: + uart_config.data_bits = UART_DATA_6_BITS; + break; + case 2: + uart_config.data_bits = UART_DATA_7_BITS; + break; + case 3: + uart_config.data_bits = UART_DATA_8_BITS; + break; + } - ESP_ERROR_CHECK( - uart_driver_install(CONFIG_WEBGUIAPP_UART_PORT_NUM, CONFIG_WEBGUIAPP_UART_BUF_SIZE * 2, 0, 20, &uart_event_queue, 0)); - ESP_ERROR_CHECK(uart_param_config(CONFIG_WEBGUIAPP_UART_PORT_NUM, &uart_config)); - ESP_ERROR_CHECK(uart_set_pin(CONFIG_WEBGUIAPP_UART_PORT_NUM, - CONFIG_WEBGUIAPP_UART_TXD, CONFIG_WEBGUIAPP_UART_RXD, CONFIG_WEBGUIAPP_UART_RTS, -1)); + + switch (GetSysConf()->serialSettings.Parity) + { + case 0: + uart_config.parity = UART_PARITY_DISABLE; + break; + case 2: + uart_config.parity = UART_PARITY_EVEN; + break; + case 3: + uart_config.parity = UART_PARITY_ODD; + break; + } + + + switch (GetSysConf()->serialSettings.StopBits) + { + case 1: + uart_config.stop_bits = UART_STOP_BITS_1; + break; + case 2: + uart_config.stop_bits = UART_STOP_BITS_1_5; + break; + case 3: + uart_config.stop_bits = UART_STOP_BITS_2; + break; + } + + + // uart_config.stop_bits = (uint8_t) GetSysConf()->serialSettings.StopBits; + + ESP_LOGI(TAG, "UART data_bits:%d parity:%d stop_bits:%d", GetSysConf()->serialSettings.DataBits, GetSysConf()->serialSettings.Parity, GetSysConf()->serialSettings.StopBits); + + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_driver_install(CONFIG_WEBGUIAPP_UART_PORT_NUM, CONFIG_WEBGUIAPP_UART_BUF_SIZE * 2, 0, 20, &uart_event_queue, 0)); + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_param_config(CONFIG_WEBGUIAPP_UART_PORT_NUM, &uart_config)); + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_set_pin(CONFIG_WEBGUIAPP_UART_PORT_NUM, CONFIG_WEBGUIAPP_UART_TXD, CONFIG_WEBGUIAPP_UART_RXD, CONFIG_WEBGUIAPP_UART_RTS, -1)); #ifdef CONFIG_WEBGUIAPP_UART_MODE_UART - ESP_ERROR_CHECK(uart_set_mode(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_MODE_UART)); -#elif CONFIG_WEBGUIAPP_UART_MODE_RS485 - ESP_ERROR_CHECK(uart_set_mode(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX)); + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_set_mode(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_MODE_UART)); +#elif CONFIG_WEBGUIAPP_UART_MODE_RS485 + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_set_mode(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_MODE_RS485_HALF_DUPLEX)); #endif - ESP_ERROR_CHECK(uart_enable_rx_intr(CONFIG_WEBGUIAPP_UART_PORT_NUM)); - ESP_ERROR_CHECK(uart_set_rx_timeout(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_READ_TOUT)); - //ESP_ERROR_CHECK(uart_enable_pattern_det_baud_intr(CONFIG_UART_PORT_NUM, '+', PATTERN_CHR_NUM, 9, 0, 0)); + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_enable_rx_intr(CONFIG_WEBGUIAPP_UART_PORT_NUM)); + ESP_ERROR_CHECK_WITHOUT_ABORT(uart_set_rx_timeout(CONFIG_WEBGUIAPP_UART_PORT_NUM, UART_READ_TOUT)); + // ESP_ERROR_CHECK_WITHOUT_ABORT(uart_enable_pattern_det_baud_intr(CONFIG_UART_PORT_NUM, '+', PATTERN_CHR_NUM, 9, 0, 0)); uart_pattern_queue_reset(CONFIG_WEBGUIAPP_UART_PORT_NUM, 20); UARTtxQueueHandle = NULL; - UARTtxQueueHandle = xQueueCreateStatic(UART_TX_QUEUE_SIZE, - sizeof(UART_DATA_SEND_STRUCT), - UARTtxQueueStorageArea, - &xStaticUARTtxQueue); + UARTtxQueueHandle = xQueueCreateStatic(UART_TX_QUEUE_SIZE, sizeof(UART_DATA_SEND_STRUCT), UARTtxQueueStorageArea, &xStaticUARTtxQueue); - xTaskCreate(serial_TX_task, "serial_tx", 1024 * 2, (void*) 0, 7, NULL); - xTaskCreate(serial_RX_task, "serial_rx", 1024 * 4, (void*) 0, 12, NULL); - ESP_LOGI(TAG, "Serial port initialized on UART%d with baudrate %d", CONFIG_WEBGUIAPP_UART_PORT_NUM, - GetSysConf()->serialSettings.BaudRate); + xTaskCreate(serial_TX_task, "serial_tx", 1024 * 2, (void *)0, 7, NULL); + xTaskCreate(serial_RX_task, "serial_rx", 1024 * 4, (void *)0, 12, NULL); + ESP_LOGI(TAG, "Serial port initialized on UART%d with baudrate %d", CONFIG_WEBGUIAPP_UART_PORT_NUM, GetSysConf()->serialSettings.BaudRate); } #endif -