打印

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

[复制链接]
3763|72
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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标志未能正确更新。

使用特权

评论回复
5
cr315| | 2024-10-18 19:23 | 只看该作者
中断优先级冲突

使用特权

评论回复
6
星辰大海不退缩| | 2024-10-31 19:14 | 只看该作者
卡死一般是软件程序问题

使用特权

评论回复
7
gyc198215| | 2024-11-1 20:35 | 只看该作者
GD32F303在温度高时,有可能出现问题。我们批量使用已发现此类问题。原来都是ST的芯片,现在我们对串口都是做超时处理。应该是芯片时序问题

使用特权

评论回复
8
olivem55arlowe| | 2024-11-8 20:30 | 只看该作者
UART硬件可能存在故障,或者相关软件库(如GD32的标准外设库)中的函数可能存在bug,导致TC标志未能正确更新,进而引发卡死。

使用特权

评论回复
评论
qazwsx1234567 2024-12-19 16:31 回复TA
如果是库函数引起的问题,怎么解决? 
9
uiint| | 2024-11-8 20:54 | 只看该作者
根据UART的发送缓冲区大小合理控制发送数据量和速度。如果数据量过大,可以考虑分批发送或增加发送缓冲区大小。

使用特权

评论回复
10
uiint| | 2024-11-8 21:48 | 只看该作者
发送完成后,确保正确清除发送完成标志(TC标志)。

使用特权

评论回复
11
adolphcocker| | 2024-11-8 21:59 | 只看该作者
串口发送函数在串口初始化配置函数之后调用。在调用发送函数之前,应确保串口已经正确配置并处于可用状态。

使用特权

评论回复
12
mmbs| | 2024-11-8 22:44 | 只看该作者
在代码中加入调试信息,记录发送数据的状态和错误信息。

使用特权

评论回复
13
louliana| | 2024-11-9 08:12 | 只看该作者
如果发送的数据量过大或发送速度过快,而UART的发送缓冲区不足以容纳所有数据,可能会导致数据丢失或发送缓冲区溢出,进而引发卡死现象。

使用特权

评论回复
14
pmp| | 2024-11-9 10:30 | 只看该作者
串口发送函数没有写在串口初始化配置函数前面。因为初始化配置函数通常包括对串口寄存器的设置,如果在初始化之前就调用发送函数,可能会导致不可预知的行为。

使用特权

评论回复
15
houjiakai| | 2024-11-9 12:51 | 只看该作者
在中断服务函数中,如果又发生了其他中断嵌套,且嵌套层数过多,可能会导致栈空间溢出,进而引发程序卡死。

使用特权

评论回复
16
kmzuaz| | 2024-11-9 14:35 | 只看该作者
在硬件设计上增加抗干扰措施,如使用屏蔽线、增加滤波器等。在软件上,可以考虑增加错误检测和处理机制,以提高通信的可靠性。

使用特权

评论回复
17
gygp| | 2024-11-9 16:14 | 只看该作者
如果使用了中断嵌套,确保嵌套配置正确,避免中断服务程序(ISR)被错误地阻塞。

使用特权

评论回复
18
sanfuzi| | 2024-11-9 18:13 | 只看该作者
检查电源的稳定性,避免因电源波动导致通信异常。

使用特权

评论回复
19
wwppd| | 2024-11-9 20:12 | 只看该作者
卡死通常是软件程序问题,可能是由于死循环、无限递归或其他逻辑错误造成的

使用特权

评论回复
20
beacherblack| | 2024-11-9 21:49 | 只看该作者
在某些情况下,如果串口发送函数与printf函数同时使用,可能会因为资源竞争或缓冲区冲突而导致串口卡死。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

438

主题

2263

帖子

3

粉丝