完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
外部硬件: 使用两个串口不停接收数据,偶尔(也不是经常出现这样的问题)出现上电后,cpu串口buff溢出的情况,导致系统不停重启。
请教这样问题的原因是什么?如何解决?谢谢。 调试信息如下:Code: Select all I (36020) rr: Check sampling lineI (36020) rr: No adapter,connect adapterI (36170) bsp_uart: UART buff full.uart2RR rec toggl1I (37160) bsp_uart: UART buff full.uart2I (37770) bsp_uart: UART buff full.uart1RR rec toggl1I (38480) bsp_uart: UART fifo OV.uart2ESP-ROM:esp32s3-20210327Build:Mar 27 2021rst:0x8 (TG1WDT_SYS_RST),boot:0x2f (SPI_FAST_FLASH_BOOT)Saved PC:0x42002f850x42002f85: panic_handler at D:/Espressif/frameworks/esp-idf-v4.4.2/components/esp_system/port/panic_handler.c:148 (discriminator 3) 串口接收程序如下:Code: Select all //-----------------------------------------------------------------------------------------void uart_event_handle(uart_port_t uart_num, QueueHandle_t queue, uart_event_t *event){// int length = 0; uint8_t *dtmp = malloc(BUF_SIZE); //char *dest = malloc(BUF_SIZE); bzero(dtmp, BUF_SIZE); //bzero(dest, BUF_SIZE); switch (event->type) { //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: //ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length)); uart_read_bytes(uart_num, dtmp,event->size, portMAX_DELAY); // //uart_write_bytes(uart_num, (const char *) dtmp, event->size); //HexToAscii(dtmp, dest, event->size); //ESP_LOGI(TAGu, "UART[%d] HEXdata:%s lenth=%d",uart_num,dest,event->size); if(uart_num == UART1_PORT_NUM) anlyze_SPO2(dtmp); else if(uart_num == UART2_PORT_NUM) { //analzye_co2(dtmp); data_analysis(dtmp[0]); exchange_value(&etco2_sensor); //HexToAscii(dtmp, dest, event->size); //ESP_LOGI(TAGu, "UART[%d] HEXdata:%s lenth=%d",uart_num,dest,event->size); } break; //Event of HW FIFO overflow detected case UART_FIFO_OVF: // If fifo overflow happened, you should consider adding flow control for your application. // The ISR has already reset the rx FIFO, // As an example, we directly flush the rx buffer here in order to read more data. // uart_flush_input(uart_num); uart_read_bytes(uart_num, dtmp,event->size, portMAX_DELAY); bzero(dtmp, BUF_SIZE); uart_flush(uart_num); xQueueReset(queue); ESP_LOGI(TAGu, "UART fifo OV.uart%d",uart_num); break; //Event of UART ring buffer full case UART_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(uart_num); uart_read_bytes(uart_num, dtmp,event->size, portMAX_DELAY); bzero(dtmp, BUF_SIZE); uart_flush(uart_num); xQueueReset(queue); ESP_LOGI(TAGu, "UART buff full.uart%d",uart_num); break; //Event of UART RX break detected case UART_BREAK: break; //Event of UART parity check error case UART_PARITY_ERR: break; //Event of UART frame error case UART_FRAME_ERR: break; //UART_PATTERN_DET case UART_PATTERN_DET: break; //Others default: break; } free(dtmp); //free(dest); dtmp = NULL;} |
|
相关推荐
2个回答
|
|
根据提供的信息,问题可能是由于串口缓冲区溢出引起的,这可能导致系统不停重启。这种情况通常发生在接收数据的速度超过处理数据的速度时。
以下是一些解决方案和建议: 1. 增加串口缓冲区大小:可以尝试增加串口接收缓冲区的大小,以容纳更多的数据。可以通过修改 `BUF_SIZE` 的值来实现。增加缓冲区大小可能会缓解缓冲区溢出的问题。 2. 提高数据处理速度:检查数据处理的代码,确保处理数据的速度足够快,以跟上串口接收数据的速度。如果处理数据的代码较慢,可能会导致数据在缓冲区中积压,最终导致缓冲区溢出。 3. 使用流控制:考虑在应用程序中添加流控制机制,以确保数据接收和处理之间的平衡。流控制可以通过硬件或软件实现,例如使用 RTS/CTS 硬件流控制信号或通过控制接收数据的速率来实现。 4. 优化代码逻辑:检查串口接收数据的代码逻辑,确保它高效并避免不必要的延迟或处理操作。优化代码可以改善数据处理速度,减少缓冲区溢出的可能性。 5. 调整串口配置参数:尝试调整串口的配置参数,例如波特率、数据位、停止位和校验位等,以提高串口传输的效率和稳定性。 6. 调试和日志记录:在代码中添加适当的调试信息和日志记录,以便跟踪问题和识别潜在的瓶颈。记录串口接收和处理数据的时间戳,以及缓冲区状态和大小的相关信息,有助于分析问题的根本原因。 7. 硬件优化:如果可能的话,检查硬件连接和线路,确保没有信号干扰或电气问题。使用合适的线缆和电气隔离方法,以减少串口通信的干扰和错误。 |
|
|
|
串口溢出问题通常是由于接收到的数据速率超过了处理器处理数据的能力,导致缓冲区溢出。在您的情况下,ESP32S3 IDF4.4.1使用两个串口接收数据,偶尔出现串口溢出导致系统重启。以下是一些建议来解决这个问题:
1. **增加缓冲区大小**:在ESP-IDF中,可以通过修改`menuconfig`中的`UART DMA TX/RX Buffer Size`来增加缓冲区的大小。这样可以在一定程度上缓解缓冲区溢出的问题。 2. **优化数据处理逻辑**:检查您的数据处理逻辑,确保数据被及时处理。如果数据处理速度跟不上接收速度,可能会导致缓冲区溢出。尝试优化数据处理流程,提高数据处理速度。 3. **降低数据接收速率**:如果可能的话,尝试降低外部设备的发送速率,以减轻处理器的负担。 4. **使用中断驱动接收**:使用中断驱动的方式来接收数据,而不是轮询。这样可以在数据到达时立即处理,减少缓冲区溢出的风险。 5. **检查硬件连接**:确保硬件连接正确,没有损坏或接触不良的情况。硬件问题可能会导致数据接收不稳定,从而引发缓冲区溢出。 6. **升级ESP-IDF版本**:您当前使用的是ESP-IDF 4.4.1版本,可以尝试升级到最新版本的ESP-IDF,看看是否有相关的修复或优化。 7. **查看错误日志**:仔细查看错误日志,了解溢出发生的具体原因。这有助于您更好地定位问题并找到解决方案。 8. **使用RTOS**:如果您还没有使用实时操作系统(RTOS),可以考虑使用RTOS来管理任务调度,以确保数据处理任务能够及时执行。 综上所述,解决串口溢出问题需要从多个方面进行考虑。首先尝试增加缓冲区大小,然后优化数据处理逻辑,降低数据接收速率,并使用中断驱动接收。同时,检查硬件连接,升级ESP-IDF版本,并使用RTOS来提高系统的稳定性。希望这些建议能帮助您解决问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
1143 浏览 1 评论
578浏览 6评论
479浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
463浏览 5评论
464浏览 4评论
440浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:46 , Processed in 0.981028 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号