GD32F 遇到串口发送数据偶发性卡死问题

[复制链接]
 楼主| stormwind123 发表于 2024-10-17 20:16 | 显示全部楼层 |阅读模式

代码如下

------

{

    volatile unsigned int i;  
    usart_interrupt_disable(USART0,USART_INT_RBNE);
    memset(g_CommData.Buffer,0x00,sizeof(DATA_COMM_PARA));
     
    for(i = 0; i < len; i++)
    {      
        TestTime =10;
        usart_data_transmit(USART0, *pbuf);
        while(usart_flag_get(USART0, USART_FLAG_TC) == RESET );
        pbuf++;
    }
    usart_interrupt_flag_clear(USART0,USART_INT_FLAG_RBNE);   
    usart_interrupt_enable(USART0,USART_INT_RBNE);

}

  项目设备使用GD32F303CC芯片,启用了UART0,用上位机发数据给设备,

同时设备UART0回复上位机(回复400左右字节),发送数据频繁偶尔会出现UART0发送数据卡死现象,

停留一在while(usart_flag_get(USART0, USART_FLAG_TC) == RESET )中,不知道为何会卡死。大家是否有遇到一样的现象?


两只袜子 发表于 2024-10-18 15:41 | 显示全部楼层
如果发送的数据量过大或发送速度过快,而UART的发送缓冲区不足以容纳所有数据,可能会导致数据丢失或发送缓冲区溢出。
elephant00 发表于 2024-10-18 15:43 | 显示全部楼层
外部电磁干扰可能会影响UART通信,导致数据丢失或状态标志错误。
jcky001 发表于 2024-10-18 19:00 | 显示全部楼层
UART硬件可能存在故障,或者相关软件库(如GD32的标准外设库)中的函数可能存在bug,导致TC标志未能正确更新。
cr315 发表于 2024-10-18 19:23 | 显示全部楼层
中断优先级冲突
星辰大海不退缩 发表于 2024-10-31 19:14 | 显示全部楼层
卡死一般是软件程序问题
gyc198215 发表于 2024-11-1 20:35 | 显示全部楼层
GD32F303在温度高时,有可能出现问题。我们批量使用已发现此类问题。原来都是ST的芯片,现在我们对串口都是做超时处理。应该是芯片时序问题
olivem55arlowe 发表于 2024-11-8 20:30 | 显示全部楼层
UART硬件可能存在故障,或者相关软件库(如GD32的标准外设库)中的函数可能存在bug,导致TC标志未能正确更新,进而引发卡死。

评论

如果是库函数引起的问题,怎么解决?  发表于 2024-12-19 16:31
uiint 发表于 2024-11-8 20:54 | 显示全部楼层
根据UART的发送缓冲区大小合理控制发送数据量和速度。如果数据量过大,可以考虑分批发送或增加发送缓冲区大小。
uiint 发表于 2024-11-8 21:48 | 显示全部楼层
发送完成后,确保正确清除发送完成标志(TC标志)。
adolphcocker 发表于 2024-11-8 21:59 | 显示全部楼层
串口发送函数在串口初始化配置函数之后调用。在调用发送函数之前,应确保串口已经正确配置并处于可用状态。
mmbs 发表于 2024-11-8 22:44 | 显示全部楼层
在代码中加入调试信息,记录发送数据的状态和错误信息。
louliana 发表于 2024-11-9 08:12 | 显示全部楼层
如果发送的数据量过大或发送速度过快,而UART的发送缓冲区不足以容纳所有数据,可能会导致数据丢失或发送缓冲区溢出,进而引发卡死现象。
pmp 发表于 2024-11-9 10:30 | 显示全部楼层
串口发送函数没有写在串口初始化配置函数前面。因为初始化配置函数通常包括对串口寄存器的设置,如果在初始化之前就调用发送函数,可能会导致不可预知的行为。
houjiakai 发表于 2024-11-9 12:51 | 显示全部楼层
在中断服务函数中,如果又发生了其他中断嵌套,且嵌套层数过多,可能会导致栈空间溢出,进而引发程序卡死。
kmzuaz 发表于 2024-11-9 14:35 | 显示全部楼层
在硬件设计上增加抗干扰措施,如使用屏蔽线、增加滤波器等。在软件上,可以考虑增加错误检测和处理机制,以提高通信的可靠性。
gygp 发表于 2024-11-9 16:14 | 显示全部楼层
如果使用了中断嵌套,确保嵌套配置正确,避免中断服务程序(ISR)被错误地阻塞。
sanfuzi 发表于 2024-11-9 18:13 | 显示全部楼层
检查电源的稳定性,避免因电源波动导致通信异常。
wwppd 发表于 2024-11-9 20:12 | 显示全部楼层
卡死通常是软件程序问题,可能是由于死循环、无限递归或其他逻辑错误造成的
beacherblack 发表于 2024-11-9 21:49 | 显示全部楼层
在某些情况下,如果串口发送函数与printf函数同时使用,可能会因为资源竞争或缓冲区冲突而导致串口卡死。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

590

主题

3621

帖子

3

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