[技术问答] HC32单片机串口频繁接收数据卡死的情况

[复制链接]
 楼主| JacksonChen 发表于 2024-12-13 17:58 | 显示全部楼层 |阅读模式
最近开始接触华大芯片,在网上关于串口频繁接收数据卡死的帖子基本都是STM32的,没有找到有关HC32对于该情况进行解答的帖子,所以请教一下大家HC32如何解决该情况。

以下是HC32L110C6UA的中断函数代码:
  1. void RxIntCallback(void)
  2. {
  3.         u8Rx** = 1;//接收完整数据标志
  4.        
  5.         //接收数据
  6.     u8RxData[uart_rx_head] = M0P_UART1->SBUF;//Uart_ReceiveData(UARTCH1);
  7.    
  8.     //更新头指针
  9.     uart_rx_head = (uart_rx_head + 1) % RX_BUFFER_SIZE;// 使用模运算防止溢出
  10.    
  11.     //清中断标志位
  12.     Uart_ClrStatus(UARTCH1 , UartRxFull);
  13. }

  14. void ErrIntCallback(void)
  15. {
  16.         Uart_ClrStatus(UARTCH1, UartRFRAMEError);//帧错误标记
  17. }


g0d5xs 发表于 2025-2-20 12:05 | 显示全部楼层
在嵌入式开发中,处理串口接收数据时确实可能会遇到数据接收频繁导致系统卡死的情况。这通常是由于数据处理不及时、缓冲区溢出或中断处理不当等原因造成的。
l1uyn9b 发表于 2025-2-20 12:14 | 显示全部楼层
检查并确保串口接收中断的优先级设置得当。如果中断优先级过高,可能会阻塞其他重要中断的处理;如果优先级过低,则可能无法及时响应接收数据。
cen9ce 发表于 2025-2-20 14:20 | 显示全部楼层
你的中断处理函数看起来相对简单,但要确保uart_rx_head变量的访问是原子的,特别是在多线程或多中断环境下。可以考虑使用临界区保护该变量,避免数据竞争
d1ng2x 发表于 2025-2-20 15:27 | 显示全部楼层
检查Uart_ClrStatus(UARTCH1 , UartRxFull);是否确实清除了正确的中断标志位。确保在读取数据后立即清除相应的中断标志,避免中断重复触发
b5z1giu 发表于 2025-2-20 16:35 | 显示全部楼层
如果HC32L110C6UA支持DMA(直接内存访问),考虑使用DMA来接收数据。DMA可以在后台传输数据,减轻CPU的负担,提高数据接收的效率。
kaif2n9j 发表于 2025-2-20 17:48 | 显示全部楼层
如果数据量较大,考虑增加接收缓冲区u8RxData的大小。同时,确保有机制来检测和处理缓冲区溢出的情况
t1ngus4 发表于 2025-2-20 19:26 | 显示全部楼层
在适当的时候重置读写指针,防止长期占用大量内存。
q1d0mnx 发表于 2025-2-21 09:14 | 显示全部楼层
在ErrIntCallback中,除了清除帧错误标记外,也可以考虑记录错误信息或重置串口接收状态,以便从错误中恢复
suw12q 发表于 2025-2-21 11:25 | 显示全部楼层
实现硬件或软件流控制(如RTS/CTS或XON/XOFF),以防止发送端发送过多数据导致接收端处理不及。
w2nme1ai7 发表于 2025-2-21 12:56 | 显示全部楼层
使用示波器或逻辑分析仪监控串口信号,确保数据正确传输。在不同数据速率和负载下测试系统,观察是否出现卡死现象。
suncat0504 发表于 2025-2-26 23:21 | 显示全部楼层
实现硬件或软件流控制(如RTS/CTS或XON/XOFF),以防止发送端发送过多数据导致接收端处理不及。 --- 这个需要额外的控制IO引脚吗?
地瓜patch 发表于 2025-2-28 12:22 来自手机 | 显示全部楼层
有时是硬件问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

7

主题

26

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部