当前位置:网站首页>STM32串口DAM接收253字节就死机原因排查
STM32串口DAM接收253字节就死机原因排查
2022-07-02 22:09:00 【ydgd118】
日前做了一个方案,是关于STM32通过M5311连接MQTT服务器进行通信的。在各项参数测试完毕后,通过MQTT服务器下发了一个300bytes的设备参数配置指令,结果直接死机了。经过多次测试,问题现象具体确定为MQTT服务器发送253字节可以正常,发送大于254字节以上STM32必死机。
为定位问题原因,于是分开测试。先测试STM32的串口通信,串口DMA接收了500字节也正常。再单独测试M5311,串口发送了300字节也正常。这就郁闷了,俩单独都没问题,为啥到一起就死机了。
- 先怀疑是串口接收缓存不够,于是检查了一下,是1000字节,绰绰有余的啊!
- 再怀疑是串口ORE溢出导致死机,结果程序里跟踪了半天,没问题,它是被冤枉的。
- 检查串口波形,发现STM32的好像波特率稍微低了一点点,不过相互都能识别,应该是在误差范围内。把波特率调整了一点,问题涛声依旧啊。
- 再怀疑是DMA错误,程序跟踪检查,没错儿。
- 实在没办法了,那就跟踪串口中断函数把。在各个if–else里都添加了打印语句,一路跟踪下来,发现串口中断处理也是很完美的。它也是被冤枉的。
- 在串口中断处理完成以后,是服务器指令解析函数,最后检查它。居然问题就是它导致的!收到串口数据后,它先把数据搬运到另一个缓存数组,然后打开DMA接收下一批数据。问题就出在搬的时候,使用了for循环,而且使用了循环变量是uint8_t,但是退出循环的判断条件是超出255的,也就是无意间变成了死循环。所以死机了。
/******************************************************************** 函 数 名:void Data_Transfer_To_Cache(void) 功能:数据缓存到另一个数组,然后立即再次打开DMA进行接收 参数:无 返回值:无 ***********************************************************************/
uint8_t Data_Transfer_To_Cache(void)
{
//先立即转存,然后打开DMA接收,再进行判断
uint8_t data_err = 0;
Clear_Tmp_Sz();
if(UART3_Rx_len<TP_LENGTH)//防止数组意外越界
{
for(uint16_t i=0;i<UART3_Rx_len;i++)
{
tmp_rx_sz[i] = UART3_Rx_buffer[i];
}
tmp_i = UART3_Rx_len;
}
else
{
data_err = 1;
}
DMA_UART3_Start();//清空接收缓存,打开DMA继续接收
// printf("\r\n%s\r\n",tmp_rx_sz);
if(data_err)
{
printf("数据超出缓存!\r\n");
return 0;
}
else
{
return 1;
}
}
这个函数负责搬砖,其中用的for(uint8_t i=0; i<UART3_Rx_len; i++)循环,在UART3_Rx_len大于255的时候,就陷入了死循环。这个是从以前的项目上直接copy过来的,根本没有考虑到这个 i 会出问题。
花了2天时间,从硬件到软件查了个遍,连串口波形都检查了,一个小小的问题浪费了很多时间,这是个教训。希望大家引以为戒吧,以后移植copy代码时候得仔细啊,或者干脆写这种循环的代码,i变量一律使用uint32_t类型,这个不可能出不去了。
边栏推荐
- 解决Chrome浏览器和Edeg浏览器主页被篡改的方法
- 创新实力再获认可!腾讯安全MSS获2022年度云原生安全守护先锋
- Rails 3 activerecord: sort by association count - rails 3 activerecord: order by count on Association
- Webrtc audio and video capture and playback examples and mediastream media stream analysis
- antd组件upload上传xlsx文件,并读取文件内容
- PMP project integration management
- Tronapi-波场接口-源码无加密-可二开--附接口文档-基于ThinkPHP5封装-作者详细指导-2022年7月1日08:43:06
- Jerry's built-in short press and long press, no matter how long it is, it is a short press [chapter]
- Lambda expression: an article takes you through
- 编辑卡顿
猜你喜欢
Graphic view frame
Dahua cloud native load balancing article - the passenger flow of small restaurants has increased
小鹏P7出事故,安全气囊未弹出,这正常吗?
Addition, deletion, modification and query of handwritten ORM (object relationship mapping)
成功改变splunk 默认URL root path
【板栗糖GIS】arcmap—如何批量修改注记要素的字体,颜色,大小等
地平线2022年4月最新方案介绍
[chestnut sugar GIS] how does global mapper batch produce ground contour lines through DSM
Gas station [problem analysis - > problem conversion - > greed]
海思3559万能平台搭建:在截获的YUV图像上画框
随机推荐
Lambda expression: an article takes you through
创新实力再获认可!腾讯安全MSS获2022年度云原生安全守护先锋
海思3559万能平台搭建:在截获的YUV图像上旋转操作
Stop slave is stuck -- the event of the transaction is not copied completely
Jerry's charge unplugged, unable to touch the boot [chapter]
Golang面试整理 三 简历如何书写
JS syntax ES6, ES7, es8, es9, ES10, es11, ES12 new features (Abstract)
悬镜安全在RSAC2022上斩获Global InfoSec Awards四项大奖
Xshell configuration xforward forwarding Firefox browser
Gas station [problem analysis - > problem conversion - > greed]
剑指 Offer II 099. 最小路径之和-双百代码
Generics and reflection, this is enough
LeetCode 968. 监控二叉树
[leetcode] number of palindromes [9]
首批 | 腾讯云完成国内首个云原生安全成熟度评估
Niuke network: maximum submatrix
Go 4 modes Singleton
高并发介绍及应对
[NPUCTF2020]ezlogin xPATH注入
全面解析分享购商业模式逻辑?分享购是如何赋能企业