IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 使用sprintf 导致死机的一个解决方法 -> 正文阅读

[嵌入式]STM32 使用sprintf 导致死机的一个解决方法

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

?但是都没能解决问题。

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

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

问题描述:

  • 原代码是为了实现通过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明明睡眠不够,精神却很好,这不正常,让我有点担心明明要猝死了

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:17:19  更:2021-08-20 15:19:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:27:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码