你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL_UART_Transmit 造成MemManage_Handler中断

[复制链接]
憨客鱼 提问时间:2025-1-16 17:59 / 未解决

当我使用HAL_UART_Transmit函数 发送大概 200个左右字节数据的时候,就会造成 MemManage_Handler中断,短小就没事,请问这个是什么问题,怎么解决啊

收藏 评论5 发布时间:2025-1-16 17:59

举报

5个回答
〃聪聪哥哥 回答时间:昨天 09:01

你可以把代码贴出来,这种发送时阻塞式发送的,应该不会进MemManage_Handler中断的

憨客鱼 回答时间:昨天 10:01

strcpy((char )g_ucCatStrBuff,"{'i':'"); for(i=0;i<24;i++) { uiD = 1<<i; if((g_uiLedDrv&uiD)==0) { strcat((char )g_ucCatStrBuff,"2");
} else { strcat((char )g_ucCatStrBuff,"1");
} } ProFun_Reback_Fun("1"); strcpy((char
)g_ucCatSendTBuff,cSendHead); strcat((char )g_ucCatSendTBuff,cSendTopic1);
strcat((char
)g_ucCatSendTBuff,(char)g_ucCatStrBuff);
strcat((char
)g_ucCatSendTBuff,cSendEnd);

// strcpy((char )g_ucCatSendTBuff,cSendHead);//-----------test Cat_Send_Str((char )g_ucCatSendTBuff);

把Cat_Send_Str((char *)g_ucCatSendTBuff);这句去掉就不会出现异常中断,把g_ucCatSendTBuff 长度变小 也不会

void Cat_Send_Str(char *pStr) { unsigned short int usLen; unsigned short int i;

usLen = strlen(pStr);

for(i=0;i<usLen;i++) { g_ucCatSendBuff[i] = ((unsigned char )pStr+i); } g_ucCatSendBuff[usLen] = 0x0D; g_ucCatSendBuff[usLen+1] = 0x0a;

Cat_Send_Data(g_ucCatSendBuff,usLen+2); }

void Cat_Send_Data(unsigned char *p, unsigned short int len) { unsigned int usLen;

usLen = len<<4; HAL_UART_Transmit(&huart1, p,len,usLen);

}

xmshao 回答时间:昨天 15:08
应该是哪里的小失误导致非法访问了。


如果数据是局部变量,部分将堆栈适当调大点;


再就是注意数据访问时别越界了,注意数组边界和指针的有效性;
憨客鱼 回答时间:1 小时前

〃聪聪哥哥 发表于 2025-1-17 09:01
你可以把代码贴出来,这种发送时阻塞式发送的,应该不会进MemManage_Handler中断的
...

strcpy((char )g_ucCatSendTBuff,cSendHead); strcat((char )g_ucCatSendTBuff,cSendTopic1);
strcat((char )g_ucCatSendTBuff,(char)g_ucCatStrBuff);
strcat((char *)g_ucCatSendTBuff,cSendEnd);

// strcpy((char )g_ucCatSendTBuff,cSendHead);//-----------test Cat_Send_Str((char )g_ucCatSendTBuff);

把Cat_Send_Str这条语句去掉就不会进入异常中断, 而且把g_ucCatSendTBuff的长度变短也不会进入异常中断

/****

  • @attention
  • Copyright (c) 2023 STMicroelectronics.
  • All rights reserved.
  • This software is licensed under terms that can be found in the LICENSE file
  • in the root directory of this software component.
  • If no LICENSE file comes with this software, it is provided AS-IS.

**/ void Cat_Send_Str(char *pStr) { unsigned short int usLen; unsigned short int i;

usLen = strlen(pStr);

for(i=0;i<usLen;i++) { g_ucCatSendBuff[i] = ((unsigned char )pStr+i); } g_ucCatSendBuff[usLen] = 0x0D; g_ucCatSendBuff[usLen+1] = 0x0a;

Cat_Send_Data(g_ucCatSendBuff,usLen+2); }

//**** // shanghai gankun // www.sensorground.com //designed by hank //All rights reserved //ÐÞ¸ÄÈÕÆÚ:2014/5/2 //°æ±¾£ºV1.0 //**** void Cat_Send_Data(unsigned char *p, unsigned short int len) { unsigned int usLen;

usLen = len<<4; HAL_UART_Transmit(&huart1, p,len,usLen);

}

憨客鱼 回答时间:1 小时前

xmshao 发表于 2025-1-17 15:08
应该是哪里的小失误导致非法访问了。</p>
<p>

多谢!最开始我也怀疑是数据越界,但是我用 R13 看是从那里跳到 异常中断的,尽然是定时器中断,

我把栈堆放大试一下

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版