STM32 使用sprintf 导致死机的一个解决方法

news/2025/2/15 19:20:25/

 我在使用sprintf 进行字符串格式化处理的时候,一执行到sprintf,STM32就死机(必死),看了很多博客,包括

  • STM32硬件错误HardFault_Handler的处理方法

  • 关于STM32 使用sprintf 死机问题!

  • 关于单片机编程里面调用sprintf死机的解决方法及原因分析

 但是都没能解决问题。

经过两天的摸索,终于在机缘巧合之下,让我蒙到了解决方法!

原理我没有办法解释,在这里把解决方法写出来供各位参考。

问题描述:

  • 原代码是为了实现通过MQTT协议连接阿里云,代码有点大,所以我就单门把出错的代码拎出来。
  • 首先我使用C语言在线调试工具测试了一下,结果居然没有问题,程序能够正常执行
  • 接着建立了一个新的keil工程,工程里只加了这一个函数,居然也没有问题

代码如下:

uint8_t ProductKey[50]="a1tN8jvX8cW";
uint8_t DeviceName[10]="D001";
uint32_t packetID=1;void sendPUBLISH(uint8_t param[0xff])
{uint8_t TopicName[0xff];uint8_t Payload[0xff];sprintf((char*)TopicName,"/sys/%s/%s/thing/event/property/post",ProductKey,DeviceName);sprintf((char*)Payload,"{\"method\":\"thing.event.property.post\",\"id\":\"%09d\",\"params\":{%s},\"version\":\"1.0.0\"}",packetID++,param);
}

解决方案:

将数组的定义由局部变成全局——即把TopicName、Payload的定义放到函数外面,原程序就可以正常执行了

一言以蔽之

        sprintf 中使用到的数组全部定义成全局数组。

uint8_t ProductKey[50]="a1tN8jvX8cW";
uint8_t DeviceName[10]="D001";
uint32_t packetID=1;/***********无法解释的解决方法***********/
uint8_t TopicName[0xff];
uint8_t Payload[0xff];
/***************************************/void sendPUBLISH(uint8_t param[0xff])
{uint8_t i=0;sprintf((char*)TopicName,"/sys/%s/%s/thing/event/property/post",ProductKey,DeviceName);sprintf((char*)Payload,"{\"method\":\"thing.event.property.post\",\"id\":\"%09d\",\"params\":{%s},\"version\":\"1.0.0\"}",packetID++,param);
}

 sprintf 简介

sprintf指的是字符串格式化命令,函数声明为 int sprintf(char *string, char *format [,argument,...]);,主要功能是把格式化的数据写入某个字符串中,即发送格式化输出到 string 所指向的字符串。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。解决这个问题,可以考虑使用 snprintf函数,该函数可对写入字符数做出限制。

简介来自百度百科

百度百科已经很详细了,但还是要推荐另一篇可以参考的文章:C 库函数 - sprintf()


昨晚看孙俪的新剧《理想之城》到两点多,今天正常上班。的现象就像这个bug明明睡眠不够,精神却很好,这不正常,让我有点担心明明要猝死了


http://www.ppmy.cn/news/470145.html

相关文章

煤矿智能更衣柜管理系统解决方案

1.总则 随着各煤矿对矿山智慧化发展方面要求的不断提高,建设高水准的智能更衣柜系统成为了员工工作环境和员工工作幸福度提高的建设重点之一,拓展更衣柜管理新模式,将电子化智能设备充分运用于更衣室日常工作中,提高更衣柜工作效…

量子计算(6)pyqpanda编程1:量子程序与量子线路

目录 一、概述 1、前言 2、构建量子程序前的几个步骤 ①导入pyqpanda包 ②创建量子虚拟机 ③申请量子比特和经典寄存器 二、QGate类 1、量子比特门 ①单量子比特无角度 ②单量子比特有角度 ③多量子比特无角度 ④多量子比特有角度 2、接口 ①对矩阵进行伴随…

输入10个学生5门课成绩,分别用函数实现下列功能

1、 计算每个学生平均分&#xff1b; 2、 计算每科平均分 &#xff1b; 3 、找出五十个分数中最高分&#xff0c;和对应的学生和课程&#xff1b; 4、求出平均分方差&#xff1a;σ1/n∑xi2-(∑xi/n)2&#xff0c;xi为某一学生的平均分。 #include<stdio.h> #include…

【数字电路基础】——逻辑门电路

数字电路基础——逻辑门电路 逻辑门电路 随着新技术的发展&#xff0c;集成数字电路类型层出不穷&#xff0c;大量使用大规模功能模块已成为现实。数字电路在众多领域已取代模拟电路&#xff0c;可以肯定&#xff0c;这一趋势将会继续发展下去。 一、逻辑门电路是什么&#…

python入门基础(14)

列表的最大与最小 描述 牛牛刚学循环语句&#xff0c;你能教他使用for语句创建一个从10到50的数字列表吗&#xff1f;请输出完整列表&#xff0c;并输出列表的首尾元素检验是否是从10到50. 输入描述&#xff1a; 无 输出描述&#xff1a; 第一行输出完整列表。 第二行输…

硬件设计中与门、或门、非门电路详解

目录 ​第一&#xff1a;与门电路 ​第二&#xff1a;或门电路 ​第三&#xff1a;非门电路 ​第四&#xff1a;门电路应用实例 ​第五&#xff1a;触摸键控电路 门电路是数字电路中最基本的逻辑单元。它可以使输出信号与输入信号之间产生一定的逻辑关系。在数字电路中&am…

木门工厂木门、门套、套线公式和算法

为了提高效率&#xff0c;节省成本&#xff0c;智点软件应邀为喻氏门厂建设企业信息化管理系统&#xff0c;主要解决木门、门套、窗套净尺寸计算&#xff1b;不同套线按不同公式计算不同价格&#xff0c;套线尺寸及数量计算&#xff1b;工人工序计件工资计算等。 门厂各参数&am…

7、门禁控制系统接线原理图,如何安装布线

一、门禁系统的基本组成 门禁系统由门禁控制器、读卡器、出门按钮、锁具、通讯转换器智能卡、电源管理软件组成。 智能卡&#xff1a;在智能门禁系统当中的作用是充当写入读取资料的介质。 控制器&#xff1a;是整个系统的核心&#xff0c;负责整个系统信息数据的输入、处理、…