乐鑫技术交流
直播中

江根磊

7年用户 988经验值
私信 关注
[问答]

esp32串口非流控模式和硬件流控模式反复切换怎么解决?

同一个串口在非流控模式和硬件流控模式之间切换,系统起来首次切换到硬件流控模式后esp32与模组串口通讯都正常;如果重新初始化串口,再设置成流控模式,esp32与模组串口通讯大概率会不正常,期间系统没有异常打印。

如果一直使用非流控模式,中途不管调用多少次uart_init(),esp32与模组串口通讯都是正常的。

调用uart_init()后 进入非流控模式,
调用uart_hw_flow_init()后 进入硬件流控模式

esp32串口非流控模式和硬件流控模式反复切换问题 有什么办法解决吗?

串口在非流控模式和硬件流控模式之间切换,是因为通过AT指令操控模组时,模组初始状态是非流控模式,初始化完成后设置模组为流控模式(使用流控模式是为了大数据量传输可靠),esp32串口也要相应切换到硬件流控模式。

Code: Select all
#define MODULE_TXD1_PIN             (GPIO_NUM_32)#define MODULE_RXD1_PIN             (GPIO_NUM_35)//only use input//UART1#define RX1_BUF_SIZE         (512) //26//#define TX1_BUF_SIZE         (512) //33//#define TXD1_PIN             MODULE_TXD1_PIN //(GPIO_NUM_25)#define RXD1_PIN             MODULE_RXD1_PIN //(GPIO_NUM_32) //(GPIO_NUM_5) //(GPIO_NUM_35)#define RXD1_CTS             (GPIO_NUM_36)//only use input#define TXD1_RTS             (GPIO_NUM_33)
Code: Select all
void uart_init(void){    xSemaphoreTake(g_at_uart_lock, portMAX_DELAY);    if(uart_is_driver_installed(AT_UART))    {        printf("%d %s()...uart_is_driver_installed rn", __LINE__, __FUNCtiON__);        ESP_ERROR_CHECK(uart_driver_delete(AT_UART));    }    int uart_num = AT_UART;    uart_config_t uart_config = {        .baud_rate = 115200,//921600,//115200,        .data_bits = UART_DATA_8_BITS,        .parity = UART_PARITY_DISABLE,        .stop_bits = UART_STOP_BITS_1,        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,        .rx_flow_ctrl_thresh = 122    };    ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));    ESP_ERROR_CHECK(uart_set_pin(uart_num, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));    ESP_ERROR_CHECK(uart_driver_install(uart_num, RX1_BUF_SIZE * 2, TX1_BUF_SIZE * 2, 0, NULL, ESP_INTR_FLAG_IRAM));    xSemaphoreGive(g_at_uart_lock);}
Code: Select all
void uart_hw_flow_init(void){    xSemaphoreTake(g_at_uart_lock, portMAX_DELAY);    if(uart_is_driver_installed(AT_UART))    {       printf("%d %s()...uart_is_driver_installed rn", __LINE__, __FUNCTION__);        ESP_ERROR_CHECK(uart_driver_delete(AT_UART));    }#define  ENABLE_HW_FLOW  1//0    int uart_num = AT_UART;    uart_config_t uart_config = {        .baud_rate = 115200,//921600,//115200,        .data_bits = UART_DATA_8_BITS,        .parity = UART_PARITY_DISABLE,        .stop_bits = UART_STOP_BITS_1,        #if ENABLE_HW_FLOW        .flow_ctrl = UART_HW_FLOWCTRL_CTS_RTS        #else        .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,        #endif        .rx_flow_ctrl_thresh = 122    };    ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));    #if ENABLE_HW_FLOW    ESP_ERROR_CHECK(uart_set_pin(uart_num, TXD1_PIN, RXD1_PIN, TXD1_RTS, RXD1_CTS));    #else    ESP_ERROR_CHECK(uart_set_pin(uart_num, TXD1_PIN, RXD1_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));    #endif    ESP_ERROR_CHECK(uart_driver_install(uart_num, RX1_BUF_SIZE * 2, TX1_BUF_SIZE * 2, 0, NULL, ESP_INTR_FLAG_IRAM));   #undef ENABLE_HW_FLOW    xSemaphoreGive(g_at_uart_lock);}

                                          

回帖(1)

熊本熊

2024-6-13 16:23:57
要解决ESP32串口在非流控模式和硬件流控模式之间反复切换的问题,可以尝试以下步骤:

1. 确保硬件连接正确:首先检查ESP32与模组之间的硬件连接是否正确,确保TX、RX、CTS、RTS等引脚连接正确。

2. 检查电源稳定性:不稳定的电源可能会影响串口通信,确保电源稳定且符合ESP32和模组的要求。

3. 优化初始化代码:在初始化串口时,确保使用正确的参数和配置。例如,波特率、数据位、停止位和校验位等。

4. 使用延时:在切换流控模式之前,可以在代码中添加适当的延时,以确保串口有足够的时间完成当前的通信任务。

5. 检查AT指令:如果问题出现在使用AT指令操控模组时,检查AT指令是否正确发送和接收,以及是否正确处理了模组的响应。

6. 考虑使用软件流控:如果硬件流控模式存在问题,可以尝试使用软件流控(如XON/XOFF)来替代硬件流控。

7. 检查串口中断:确保ESP32的串口中断处理函数正确实现,并且在切换流控模式时不会影响中断处理。

8. 更新固件和库:检查ESP32的固件和串口通信库是否为最新版本,以确保没有已知的问题或错误。

9. 调试和日志记录:在代码中添加调试信息和日志记录,以便在出现问题时能够快速定位问题所在。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分