完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
同一个串口在非流控模式和硬件流控模式之间切换,系统起来首次切换到硬件流控模式后esp32与模组串口通讯都正常;如果重新初始化串口,再设置成流控模式,esp32与模组串口通讯大概率会不正常,期间系统没有异常打印。
如果一直使用非流控模式,中途不管调用多少次uart_init(),esp32与模组串口通讯都是正常的。 调用uart_init()后 进入非流控模式, 调用uart_hw_flow_init()后 进入硬件流控模式 esp32串口非流控模式和硬件流控模式反复切换问题 有什么办法解决吗? |
|
相关推荐
1个回答
|
|
串口在非流控模式和硬件流控模式之间切换,是因为通过AT指令操控模组时,模组初始状态是非流控模式,初始化完成后设置模组为流控模式(使用流控模式是为了大数据量传输可靠),esp32串口也要相应切换到硬件流控模式。
Code: #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: 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: 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); } |
|
|
|
只有小组成员才能发言,加入小组>>
920 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
446浏览 5评论
446浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 16:17 , Processed in 1.011653 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号