OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4985|回复: 7

调试正点原子的GSM模块M3老跑死

[复制链接]

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
发表于 2014-3-15 20:40:37 | 显示全部楼层 |阅读模式
只要接收的发送短信信号,发送后,就跑死了,用仿真器跟踪总是到这里死了。。不知道什么意思啊。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-15 23:05:41 | 显示全部楼层
回复【楼主位】a2582006460:
---------------------------------
1,没有中断服务函数?
2,是否数组访问越界?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2014-3-16 09:03:11 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥太牛了!一下子就看到问题了。的确是数组有问题,但是我搞不清楚我怎么数组访问越界的?
首先我定义了2个数组
u16 DATA[40];
u16 DATA_buf[40];
然后通过串口传输数据的第一位确定数组的下标
Decice_ID=USART3_RX_BUF[0];
Decice_ID=Decice_ID%39;                     //为了防止越界取余
DATA_buf[Decice_ID]=DATA[Decice_ID];
后面全部调用的DATA_buf[Decice_ID]和DATA[Decice_ID]了
当我把DATA_buf[Decice_ID]和DATA[Decice_ID]用DATA_buf和DATA替换了,程序又正常了。

主程序代码
int main(void)
{
    u16 t;
u16 DATA[40]; //缓存zigbee串口数据
u16 DATA_buf[40]; //二级缓存zigbee串口数据
u8 Decice_ID=0;
//产生警报提示语
u8 WLW[21]="Device0 Water Level ";
u8 CLW[21]="Device0 Covers Loss ";
u8 COW[23]="Device0 CH4 Overproof ";
u8 WL_CLW[47]="Device0 Water Level Overproof and Covers Loss ";
u8 CO_CLW[39]="Device0 Covers Loss and CH4 Overproof ";
u8 WL_COW[49]="Device0 Water Level Overproof and CH4 Overproof ";
u8 WL_CL_COW[63]="Device0 Water Level Overproof , Covers Loss and CH4 Overproof ";
u16 len; //串口传送信息长度
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200);  //串口1初始化 
LCD_Init(); //初始化液晶 
LED_Init();          //LED初始化  
KEY_Init(); //按键初始化  
  USART2_Init(36,115200); //初始化串口2
delay_ms(200);
uart3_init(36,115200);  //串口3初始化   
mem_init(SRAMIN); //初始化内部内存池     
  exfuns_init(); //为fatfs相关变量申请内存
TP_Init(); //触摸屏初始化
Custom_GUI();
while(1)
{
if(USART3_RX_STA&0x8000)    
{    
len=USART3_RX_STA&0x3FFF; //得到此次接收到的数据长度
for(t=0;t<len;t++)
{
USART3->DR=USART3_RX_BUF[t];
LCD_ShowChar(8*t,0,USART3_RX_BUF[t]+48,16,0);
while((USART3->SR&0X40)==0); //等待发送结束
}
USART3_RX_STA=0;
LCD_ShowxNum(200,0,USART3_RX_BUF[0],8,16,0);
Decice_ID=USART3_RX_BUF[0];
Decice_ID=Decice_ID%39;
DATA_buf[Decice_ID]=DATA[Decice_ID];
DATA[Decice_ID]=(USART3_RX_BUF[1])*0x4000+(USART3_RX_BUF[2])*0x2000+(USART3_RX_BUF[3])*0x1000;
//整合数据在16为数据中高四位存储传感器信息,低12位存储终端编码
if((DATA_buf[Decice_ID]!=DATA[Decice_ID]) && \
DATA_buf[Decice_ID]!=0)//数据发生改变,发送短信通知
{
switch(DATA[Decice_ID]&0xF000)
{
case 0x3000:WLW[6]=USART3_RX_BUF[0];sim900a_test_msg=WLW;sim900a_sms();break;
case 0x5000:CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=CLW;sim900a_sms();break;
case 0x6000:COW[6]=USART3_RX_BUF[0];sim900a_test_msg=COW;sim900a_sms();break;
case 0x1000:WL_CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_CLW;sim900a_sms();break;
case 0x4000:CO_CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=CO_CLW;sim900a_sms();break;
case 0x2000:WL_COW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_COW;sim900a_sms();break;
case 0x0000:WL_CL_COW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_CL_COW;
 sim900a_sms();break;
default: break;
}
}
delay_ms(10);
Custom_GUI_fresh(DATA[Decice_ID]); //更新GUI显示状态
}
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
LCD_LED=!LCD_LED; //背光控制
while(KEY2==0);
}
}
tp_dev.scan(0);   
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下 tp_dev.x为x值tp_dev.y为y值
{
  if(tp_dev.x<lcddev.width&&tp_dev.y><lcddev.height)
{
if(tp_dev.x>240&&tp_dev.x<290&&tp_dev.y>194&&tp_dev.y<214)
Page++;
if(tp_dev.x>25&&tp_dev.x<75&&tp_dev.y>194&&tp_dev.y<214&&Page>0)
Page--;       
}
Custom_GUI();
while(PEN==0);
}
}
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-16 14:24:09 | 显示全部楼层
回复【3楼】a2582006460:
---------------------------------
不要搞这么多局部数组到main函数里面,放main函数外面试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2014-3-22 11:02:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------
我把数组迁移到外面了,果然不跑死了,这到底是怎么一回事呢?话说这在主函数之中的局部变量到底与其他的子函数 的局部变量是否有什么不同之处呢?如果在主函数中有死循环while(1)的话是不是就可以视为全局变量?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-22 14:56:04 | 显示全部楼层
回复【5楼】a2582006460:
---------------------------------
局部变量太多,堆栈溢出了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-7-19
在线时间
0 小时
发表于 2014-3-23 01:45:16 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
看了这段对话。。。发现牛人不愧是牛人。。。句句在点子上。赞一个原子哥
ShawnLu
回复 支持 反对

使用道具 举报

18

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2013-7-31
在线时间
0 小时
 楼主| 发表于 2014-3-23 13:12:22 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,果然大神。上网搜了一下,这好像涉及汇编了,没学过,不太懂。只知道全局变量存在数据区,局部变量存在栈区。以后注意,感谢原子哥的指导。点个赞
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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