硬汉嵌入式论坛

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

[有问必答] 调用串口格式化输出函数出现硬件错误

[复制链接]

6

主题

31

回帖

49

积分

初级会员

积分
49
发表于 2024-1-5 20:51:30 | 显示全部楼层 |阅读模式
本帖最后由 厉飞雨 于 2024-1-5 20:56 编辑

使用串口DMA发送格式化字符串,分别使用两种方法,感觉两种方法差不多,一种没有问题,另外一种会出现硬件错误,有大佬能分析一下这是为啥吗?(使用了freeRTOS,开启了EventRecorder)

第一种没有问题代码如下
[C] 纯文本查看 复制代码
float temperature,humidity;        
char message[50];  
while(1){  
 if(aht20State ==0)
{
...
}

else if(aht20State ==1)
{
...
}

...
else if(aht20State ==4)
        {       
                AHT20_Analysis(&temperature, &humidity);
                LED1_TOGGLE();
                sprintf (message,"温度:%.1f ℃,湿度: %.1f %%\r\n",temperature,humidity);
                HAL_UART_Transmit_DMA(&huart1,(uint8_t*)message,strlen(message));                        
                osDelay(1000);
                aht20State = 0;
        }
}


第二种发送一次数据就会出现硬件错误如下
[C] 纯文本查看 复制代码
float temperature,humidity;        
char message[50];     
while(1){  
 if(aht20State ==0)
{
...
}

else if(aht20State ==1)
{
...
}

...  
else if(aht20State ==4)
        {        
        
                AHT20_Analysis(&temperature, &humidity);
                LED1_TOGGLE();
                u1_printf("温度:%.1f ℃,湿度: %.1f %%\r\n",temperature,humidity);
                osDelay(1000);
                aht20State = 0;
        }
}

其中u1_printf函数如下
[C] 纯文本查看 复制代码
void u1_printf(char *fmt,...)
{
        char String[100];
        va_list arg;
        va_start(arg, fmt);
        vsprintf(String, fmt, arg);
        va_end(arg);
        HAL_UART_Transmit_DMA(&huart1,(uint8_t*)String,strlen(String));                        
}



回复

使用道具 举报

0

主题

124

回帖

124

积分

初级会员

积分
124
发表于 2024-1-6 01:51:04 | 显示全部楼层
第二种用的是局部变量String[100]是在栈内的, 退出函数后就会回收用到下一个函数, 显然当你退出函数时,数据还没发送,最起码是没发送完, 这应该是问题的原因吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2024-1-6 09:36:24 | 显示全部楼层
第2钟是不是任务栈开小了。看着有个大的局部变量char String[100];

另外注意,你这个是DMA发送,一定要等待上次发送完毕了,才可以发送下次,你的程序里面处理这个没。
回复

使用道具 举报

6

主题

31

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2024-1-7 15:35:18 | 显示全部楼层
Edmund1964 发表于 2024-1-6 01:51
第二种用的是局部变量String[100]是在栈内的, 退出函数后就会回收用到下一个函数, 显然当你退出函数时, ...

感谢,确实是这样的,我把string[100]变成全局变量就没问题了,DMA启动需要时间,还没发送完,内存就被回收了
回复

使用道具 举报

6

主题

31

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2024-1-7 15:36:46 | 显示全部楼层
eric2013 发表于 2024-1-6 09:36
第2钟是不是任务栈开小了。看着有个大的局部变量char String[100];

另外注意,你这个是DMA发送,一定要 ...

确实是DMA的原因,没等DMA发完,局部变量就被回收了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-7 18:19 , Processed in 0.238363 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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