硬汉嵌入式论坛

 找回密码
 立即注册
查看: 674|回复: 3
收起左侧

[有问必答] uart用printf发送,uart接收卡死问题疑问

[复制链接]

14

主题

34

回帖

76

积分

初级会员

积分
76
发表于 2022-9-5 11:03:37 | 显示全部楼层 |阅读模式
硬件stm32f103vc
功能通过模拟开关切换采集adc共1024个,也就是十六进制2048字节,然后转化为浮点型,通过接收不同串口命令,发送十六进制或者发送字符串。
故障现象,串口助手自动发送请求浮点型字符串(用Printf打印),间隔500ms就开始卡死了,间隔越短越容易卡死,但是发送数据请求十六进制ADC值却没问题。
自己做过定时printf打印 证明发送没问题
各种清标记位,加__HAL_UNLOCK(),故障还是存在,烦请各位看下是啥问题,部分代码如下
主函数中串口发送
                if(k == 0xF0)
                {
                        k = 0;
                        PrintSysinfo();
                }
                if(k == 0xF1)               // 串口接收不会卡死,串口助手自动发送间隔可以到50ms 100 ms都不会卡死,每请求一次单片机发送2048字节
                {
                        k = 0;
                        HAL_UART_Transmit(&huart2,(u8 *)&ADC_TotalBuffer,2048,0xFFFF);
                }
                if(k == 0xF3)              // 串口接收卡死,串口助手自动发送间隔500ms都会几秒后卡死,时间越长越不容易卡死,每请求一次单片机发送1024个字符串。
                {
                        printf("\r\n");
                        printf("-------------------------------------------------------------------------------------------------------------------------------");
                        k = 0;
                        printf("\r\n");
                        for(H = 0;H <= 31;H ++)
                        {
                                for(V = 0;V <= 31;V ++)
                                {
                                        printf("%.1f ",Vot_TotalBuffer[V][H]);
                                }
                        }
                       
                        printf("\r\n");
                        printf("-------------------------------------------------------------------------------------------------------------------------------");
                }



串口接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(HAL_UART_Receive_IT(&huart2, (uint8_t *)&RxBuffer, 1) != HAL_OK)
    {
        huart2.RxState = HAL_UART_STATE_READY;
        __HAL_UNLOCK(&huart2);
    }

     if (__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_PE) != RESET)
    {
        HAL_UART_Receive_IT(&huart2,RxBuffer,1);
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_PE);
    }

    if (__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE) != RESET)
    {
        HAL_UART_Receive_IT(&huart2,RxBuffer,1);
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_ORE);
    }   

     if (__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_FE) != RESET)
    {
        HAL_UART_Receive_IT(&huart2,RxBuffer,1);
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_FE);
    }

     if (__HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC) != RESET)
    {
        HAL_UART_Receive_IT(&huart2,RxBuffer,1);
        __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_TC);
    }   

     if(__HAL_UART_CLEAR_FLAG(&huart2, UART_IT_RXNE) != RESET)
     {   
         __HAL_UART_CLEAR_FLAG(&huart2, UART_FLAG_RXNE);
         __HAL_UART_CLEAR_FLAG(&huart2, UART_IT_RXNE);
         HAL_UART_Receive_IT(&huart2,RxBuffer,1);
     }       

    HAL_UART_IRQHandler(&huart2);
     if(*RxBuffer == 0xF0)
    {
        k = 0xF0;
    }
    if(*RxBuffer == 0xF1)
    {
        k = 0xF1;
    }
    if(*RxBuffer == 0xF2)
    {
        k = 0xF2;
    }
    if(*RxBuffer == 0xF3)
    {
        k = 0xF3;
    }       
}





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106912
QQ
发表于 2022-9-5 13:10:19 | 显示全部楼层
感觉你的中断处理姿势不对,中断里仅需调用  HAL_UART_IRQHandler(&huart2)

然后你的回调函数HAL_UART_RxCpltCallback里面也什么都不用管,仅需处理你的数据就行,标志清楚什么,在函数 HAL_UART_IRQHandler里面已经处理了。
回复

使用道具 举报

14

主题

34

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2022-9-5 15:52:46 | 显示全部楼层
eric2013 发表于 2022-9-5 13:10
感觉你的中断处理姿势不对,中断里仅需调用  HAL_UART_IRQHandler(&huart2)

然后你的回调函数HAL_UART_R ...

谢谢回复,我只留下数据处理部分,清理标志位注释掉,发现还是一样,并且十六进制数据接收命令也会卡死,不知道是printf的使用问题,还是串口接收数据处理的问题,没有头绪
回复

使用道具 举报

75

主题

685

回帖

910

积分

金牌会员

积分
910
发表于 2022-9-5 17:29:57 | 显示全部楼层
应该是你数据量太大了,1024个浮点数如果是float的话4096,如果是double就8192。减少负载测试看看会不会死。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 15:38 , Processed in 0.246664 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表