完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
g ESP32 C3, IDF 4.3.1版本, exampleswifipower_save这个例程,加上一个UART接收功能,发现UART数据接收不正常,收不到正确数据(但发UART数据可以)
测试程序如下: // check if power save/light sleep will affect uart or not static void uart_task(void *arg) { /* Configure parameters of an UART driver, * communication pins and install the driver */ uart_config_t uart_config = { .baud_rate = 115200, .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, }; int intr_alloc_flags = 0; #if CONFIG_UART_ISR_IN_IRAM intr_alloc_flags = ESP_INTR_FLAG_IRAM; #endif ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE * 4, 0, 0, NULL, intr_alloc_flags)); ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config)); ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS)); // Configure a temporary buffer for the incoming data uint8_t *data = (uint8_t *) malloc(BUF_SIZE); while (1) { // Read data from the UART int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, BUF_SIZE, 20 / portTICK_RATE_MS); if(len > 0) // // Write data back to the UART uart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, BUF_SIZE); vTaskDelay(20 / portTICK_PERIOD_MS); // every uart command gap 8ms data[0] = 0; } free(data); } void app_main(void) { // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK( ret ); #if CONFIG_PM_ENABLE // Configure dynamic frequency scaling: // maximum and minimum frequencies are set in sdkconfig, // automatic light sleep is enabled if tickless idle support is enabled. esp_pm_config_esp32c3_t pm_config = { .max_freq_mhz = CONFIG_EXAMPLE_MAX_CPU_FREQ_MHZ, .min_freq_mhz = CONFIG_EXAMPLE_MIN_CPU_FREQ_MHZ, #if CONFIG_FREERTOS_USE_TICKLESS_IDLE // note ,if enabled this (pw saving), uart will fail to work correctly .light_sleep_enable = true #endif }; ESP_ERROR_CHECK( esp_pm_configure(&pm_config) ); #endif // CONFIG_PM_ENABLE initialise_wifi(); xTaskCreate(uart_task, "uart_rev_task", ECHO_TASK_STACK_SIZE, NULL, 10, NULL); // configMAX_PRIORITIES - 0 wifi_power_save(); } 当在menuconfig中disable power saving后,串口才能接收正常。 请问,是否是在light sleep 模式下, C3的串口接收不能正常工作? |
|
相关推荐
1个回答
|
|
|
在ESP32 C3上使用power_save模式时,UART数据接收不正常的问题可能是由于多种原因导致的。以下是一些建议和解决方案,帮助您解决这个问题:
1. **检查电源管理设置**: 确保在进入低功耗模式之前,UART已经配置好并初始化。在ESP-IDF中,您可以使用`esp_pm_config_esp32c3()`函数配置电源管理策略。 2. **确保UART中断优先级设置正确**: 在ESP-IDF中,您需要确保UART中断的优先级设置得当。如果中断优先级太低,可能会导致中断响应不及时,从而影响数据接收。 3. **检查UART接收缓冲区大小**: 确保UART接收缓冲区足够大,以避免在接收大量数据时溢出。您可以使用`uart_set_rx_buffer_size()`函数调整接收缓冲区大小。 4. **使用环形缓冲区**: 使用环形缓冲区(如`RingBuffer`)来存储接收到的数据,可以提高数据接收的可靠性。 5. **检查串口波特率和数据位设置**: 确保发送端和接收端的波特率、数据位、停止位和奇偶校验位设置一致。 6. **检查硬件连接**: 检查UART引脚连接是否正确,确保没有接触不良或线路干扰。 7. **使用软件流控制**: 如果可能,尝试使用软件流控制(如XON/XOFF)来控制数据流,以防止数据丢失。 8. **检查电源干扰**: 确保电源供应稳定,避免电源干扰影响UART通信。 9. **使用ESP-IDF的日志系统**: 使用ESP-IDF的日志系统(如`esp_log_level_set()`)来记录UART操作的详细信息,以便分析问题。 10. **更新ESP-IDF版本**: 如果您使用的是较旧的ESP-IDF版本,尝试更新到最新版本,以获取可能的修复和改进。 以下是一个简化的示例代码,用于在ESP32 C3上配置UART并接收数据: ```c #include "esp_log.h" #include "driver/uart.h" #define UART_NUM UART_NUM_1 #define RX_BUF_SIZE 1024 static const char *TAG = "UART_EXAMPLE"; void uart_task(void *arg) { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; // 安装UART驱动程序 uart_driver_install(UART_NUM, RX_BUF_SIZE * 2, 0, 0, NULL, 0); // 配置UART参数 uart_param_config(UART_NUM, &uart_config); while (1) { // 创建一个环形缓冲区 RingBufferHandle_t rb = xRingbufferCreate(RX_BUF_SIZE); // 接收数据 uint8_t *data = (uint8_t *) malloc(RX_BUF_SIZE); int len = uart_read_bytes(UART_NUM, data, RX_BUF_SIZE, 1000 / portTICK_PERIOD_MS); if (len > 0) { // 将数据写入环形缓冲区 xRingbufferSend(rb, data, len, 0); } // 处理数据... // 清理 vRingbufferDelete(rb); free(data); } } ``` 请注意,这只是一个示例,您可能需要根据您的具体需求进行调整。希望这些建议能帮助您解决问题。 |
|
|
|
|
只有小组成员才能发言,加入小组>>
944 浏览 0 评论
1671 浏览 0 评论
请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
1330 浏览 1 评论
1233 浏览 1 评论
5015 浏览 2 评论
为blufi_device设置自定义名称,但是无法修改,为什么?
1252浏览 4评论
请问ESP32-S2-WROOM怎么获得ESP32-S2外接FLASH的唯一序列号?
927浏览 3评论
2336浏览 3评论
ESP-IDF的VScode插件的build按钮点击会报错的原因?
2526浏览 3评论
ESP-Jumpstart例程中第5个工程:5_cloud连接报错是哪里的问题?
1051浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 02:18 , Processed in 0.465611 second(s), Total 43, Slave 36 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
312
